📄 threadclass.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 + -