⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threadclass.cpp

📁 电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下
💻 CPP
字号:
#include "threadclass.h"#include "ysdataprocess.h"extern CPublicClass g_PublicClass;//******************************初始化线程****************************void *InitDeviceTreeThread(void* lp){    if(lp) return NULL;    BCDataProcess dp;long hdbc=-1;    dp.StartAllModule(hdbc);    return NULL;}/////////////////////////////////////常驻接收信息线程//////////////////////////////////////void *RecvMsgQueueThread(void* lp){    lp=NULL;    CMessageQueue cm;st_nodeinfo st;CSegment cs;    while(!g_PublicClass.m_Stop)    {	//当没有收到消息号时,等待	if(g_PublicClass.m_MsgQueueID[0]==0) 	{	    pthread_yield();continue;	}	//检查在接收队列中是否有属于本进程的消息	int QueueIndex=cm.CheckMessage(g_PublicClass.m_MsgQueueID,g_PublicClass.m_SelfPid);	if(QueueIndex<0)	{	    //如果没有消息,加锁等待	    printf("recv data lock......\n");	    g_PublicClass.m_NoticQueueLock.lock();	    printf("recv data unlock......\n");	    pthread_yield();	    continue;	}	//接收消息	memset(&st,0x00,sizeof(st_nodeinfo));	if(cm.Read_Message(g_PublicClass.m_MsgQueueID[QueueIndex],g_PublicClass.m_SelfPid,			   &st,sizeof(st_nodeinfo))<0) 	{	    pthread_yield();	    continue;	}	//加入数据队列	CDataNode* pNode=new CDataNode();	char* buff=NULL;	memcpy(&pNode->m_nodeinfo,&st,sizeof(st_nodeinfo));	if(pNode->m_nodeinfo.m_iSize>0&&pNode->m_nodeinfo.m_SegmentPid>0)	{	    buff=new char[pNode->m_nodeinfo.m_iSize];   //此处不删除,在数据处理线程中删除	    cs.ReadSegment(pNode->m_nodeinfo.m_SegmentPid,buff,pNode->m_nodeinfo.m_iSize);	    pNode->m_nodeinfo.m_SegmentPid=(long)buff;	}	g_PublicClass.m_NodeManage.m_RecvNode.append(pNode);	printf("%s收到一个接点\n" , g_PublicClass.m_ModuleName.data());//2006-3-24	printf("===RECEIVE pNode->m_nodeinfo.mtype 			= %ld\n",pNode->m_nodeinfo.mtype);	printf("===RECEIVE pNode->m_nodeinfo.requestid 			= %ld\n",pNode->m_nodeinfo.requestid);	printf("===RECEIVE pNode->m_nodeinfo.transtopid 		= %ld\n",pNode->m_nodeinfo.transtopid);	printf("===RECEIVE pNode->m_nodeinfo.m_CurrentThread 		= %ld\n",pNode->m_nodeinfo.m_CurrentThread);	printf("===RECEIVE pNode->m_nodeinfo.m_TransThread 		= %ld\n",pNode->m_nodeinfo.m_TransThread);	printf("===RECEIVE pNode->m_nodeinfo.m_RecordFlag 		= %s\n",pNode->m_nodeinfo.m_RecordFlag);	//LiangZhen 2006-03-13	printf("===RECEIVE pNode->m_nodeinfo.m_DataType 		= %d\n",pNode->m_nodeinfo.m_DataType);	printf("===RECEIVE pNode->m_nodeinfo.m_UniqueCmd 		= %s\n",pNode->m_nodeinfo.m_UniqueCmd);	printf("===RECEIVE pNode->m_nodeinfo.m_RecvMachineNo 		= %d\n",pNode->m_nodeinfo.m_RecvMachineNo);	//LiangZhen 2006-03-10	printf("===RECEIVE pNode->m_nodeinfo.m_MachineNo 		= %d\n",pNode->m_nodeinfo.m_MachineNo);	//LiangZhen 2006-03-10	printf("===RECEIVE pNode->m_nodeinfo.m_iResult 			= %d\n",pNode->m_nodeinfo.m_iResult);	//LiangZhen 2006-03-10	printf("===RECEIVE pNode->m_nodeinfo.m_TableName 		= %s\n",pNode->m_nodeinfo.m_TableName);	//LiangZhen 2006-03-13	printf("===Current Time : %s \n" , getTimeStr()) ;	//Liang 2006/7/19		//通知数据处理线程有数据接点可以处理	printf("process recv unlock......\n");	g_PublicClass.m_NoticRecvLock.unlock();	pthread_yield();usleep(10);    }    return NULL;}/////////////////////////////////////常驻发送信息线程//////////////////////////////////////void *SendMsgQueueThread(void* lp){    lp=NULL;    CMessageQueue cm;CSegment cs;    CDataNode* pNode=NULL;    BCDataProcess dp;long hdbc=0;    dp.ConnectDatabase(hdbc);    while(!g_PublicClass.m_Stop)    {	//当发送队列没有形成时,等待	if(g_PublicClass.m_MsgQueueID[0]==0) 	{	    pthread_yield();continue;	}	//此处加锁	CLMutexLocker locker(&g_PublicClass.m_NodeManage.m_NoticSendLock);	pNode=g_PublicClass.m_NodeManage.FindSendDataNode();	if(!pNode)	{	    printf("No Send Node send data lock......\n");	    g_PublicClass.m_NodeManage.m_NoticSendLock.lock();			//如果没有数据加锁阻塞	    printf("No Send Node send data unlock......\n");	    pthread_yield();continue;	}	//如果模块已经终止,不发送消息	int pid=pNode->m_nodeinfo.mtype;	bool bb=dp.CheckModuleRunning(hdbc,pid);	if(!bb) 	 //如果模块已经终止,不用发送,直接删除数据	{		printf("PID:%d模块已经终止,不用发送,直接删除数据\n" , pid) ;	    g_PublicClass.m_NodeManage.DeleteSendDataNode(pNode);	    pthread_yield();continue;	}		//int temp = pNode->m_nodeinfo.m_RecvMachineNo ;	//LiangZhen 2006-03-10	//pNode->m_nodeinfo.m_RecvMachineNo = pNode->m_nodeinfo.m_MachineNo ;	//LiangZhen 2006-03-10    //pNode->m_nodeinfo.m_MachineNo = temp ;	//LiangZhen 2006-03-10	cm.SendMessage(g_PublicClass.m_MsgQueueID,(void*)pNode);	//通知目标进程有数据	g_PublicClass.m_Signal.SendSignal(pid, NOTICQUEUE, 1, NULL, 0);	printf("%s发送一个接点\n" , g_PublicClass.m_ModuleName.data());//2006-3-24	printf("===RECEIVE pNode->m_nodeinfo.mtype 			= %ld\n",pNode->m_nodeinfo.mtype);	printf("===RECEIVE pNode->m_nodeinfo.requestid 			= %ld\n",pNode->m_nodeinfo.requestid);	printf("===RECEIVE pNode->m_nodeinfo.transtopid 		= %ld\n",pNode->m_nodeinfo.transtopid);	printf("===RECEIVE pNode->m_nodeinfo.m_CurrentThread 		= %ld\n",pNode->m_nodeinfo.m_CurrentThread);	printf("===RECEIVE pNode->m_nodeinfo.m_TransThread 		= %ld\n",pNode->m_nodeinfo.m_TransThread);	printf("===RECEIVE pNode->m_nodeinfo.m_RecordFlag 		= %s\n",pNode->m_nodeinfo.m_RecordFlag);	//LiangZhen 2006-03-13	printf("===RECEIVE pNode->m_nodeinfo.m_DataType 		= %d\n",pNode->m_nodeinfo.m_DataType);	printf("===RECEIVE pNode->m_nodeinfo.m_UniqueCmd 		= %s\n",pNode->m_nodeinfo.m_UniqueCmd);	printf("===RECEIVE pNode->m_nodeinfo.m_RecvMachineNo 		= %d\n",pNode->m_nodeinfo.m_RecvMachineNo);	//LiangZhen 2006-03-10	printf("===RECEIVE pNode->m_nodeinfo.m_MachineNo 		= %d\n",pNode->m_nodeinfo.m_MachineNo);	//LiangZhen 2006-03-10	printf("===RECEIVE pNode->m_nodeinfo.m_iResult 			= %d\n",pNode->m_nodeinfo.m_iResult);	//LiangZhen 2006-03-10	printf("===RECEIVE pNode->m_nodeinfo.m_TableName 		= %s\n",pNode->m_nodeinfo.m_TableName);	//LiangZhen 2006-03-13	printf("===Current Time : %s \n" , getTimeStr()) ;	//Liang 2006/7/19		//删除数据接点	g_PublicClass.m_NodeManage.DeleteSendDataNode(pNode);	pthread_yield();    }    return NULL;}void *ProcessRecvMsgThread(void* lp){    if(lp) return NULL;    CDataNode* pNode=NULL;    BCDataProcess dp;long hdbc=0;    dp.ConnectDatabase(hdbc);    while(!g_PublicClass.m_Stop)    {	//在接收队列中查找一个接点	pNode=g_PublicClass.m_NodeManage.FindRecvDataNode();	if(!pNode)	{	    printf("process recv lock......\n");	    g_PublicClass.m_NoticRecvLock.lock();	    printf("process recv unlock......\n");	    usleep(10);continue;	}	/***********************************************************************	  Modyfi 	//LiangZhen 2006-03-12	//判定接点中的转发进程号是否>0并且不等于g_PublicClass.m_SelfPid,如果成立,则直接转发	if(pNode->m_nodeinfo.transtopid>(long)0&&pNode->m_nodeinfo.transtopid!=(long)g_PublicClass.m_SelfPid)  	{	    CDataNode* sendNode=new CDataNode(pNode);	    sendNode->m_nodeinfo.mtype=pNode->m_nodeinfo.transtopid;	    if(pNode->m_nodeinfo.m_iResult==0)   //命令	    {		sendNode->m_nodeinfo.transtopid=pNode->m_nodeinfo.requestid;		sendNode->m_nodeinfo.requestid=g_PublicClass.m_SelfPid;	    }	    else				//结果	    {		sendNode->m_nodeinfo.transtopid=0;	    }	    sendNode->m_nodeinfo.m_CurrentThread=pNode->m_nodeinfo.m_TransThread;	    sendNode->m_nodeinfo.m_TransThread=0;	    g_PublicClass.m_NodeManage.AddSendDataNode(sendNode);	    //删除接点	    g_PublicClass.m_NodeManage.DeleteRecvDataNode(pNode);	    usleep(10);	    continue;	}	*************************************************************************/	//判断数据类型,分类处理	switch(pNode->m_nodeinfo.m_DataType)	{	case DATA_EVENT:	    {		dp.NoticOperModule(hdbc,pNode->m_nodeinfo);				//通知操作模块		dp.MakeToSendState(hdbc,pNode->m_nodeinfo);	    }	    break;	case DATA_FAULT:	    {		//dp.PreMakeNoteList(hdbc,pNode->m_nodeinfo);				//形成简要报告列表		dp.NoticOperModule(hdbc,pNode->m_nodeinfo);				//通知操作模块		dp.MakeToSendState(hdbc,pNode->m_nodeinfo);				//加入发送状态表	    }	    break;	default:		usleep(100);		continue;	}	//删除接点	g_PublicClass.m_NodeManage.DeleteRecvDataNode(pNode);	usleep(10);    }    return NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -