关于在一个线程中处理多个UDP通道通信数据引起CPU和内存占用高,程序运行不流畅
问题提出:我的软件要和多个软件进行通信,假如有n个软件和我的软件通信,我就建立n个UDP通道,这些UDP通道收来的数据我要在一个线程里面全部处理,现在该部分已经实现,但是出现CPU占用高(50%左右),内存占用高(240M左右),如何能够在不动该接收机制的前提下优化该部分?
数据接收线程如下:
首先我是绑定套接字
程序代码:
ip_Flag = FALSE; //初始化标志量为假,此处若初始化为真,无IP通道时会启动线程 for (unsigned int i = 0; i < ComNum; i++) { if (FALSE == Init_IP(i)) //Init_IP(i)绑定套接字成功返回真,否则为假 { ip_Flag = FALSE; break; //此处有一个通道未创建成功,则跳出循环,且不允许启动接收数据线程 } else { ip_Flag = TRUE; } } if (TRUE == ip_Flag) { /*启动接收数据线程*/ AfxBeginThread(ReceiveUDP, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL); //该线程不启动时,程序CPU占用连10%都不会超过,基本常态就在1%左右。 }
接收数据线程如下:
程序代码:
UINT CMonitorView::ReceiveUDP(LPVOID p) { int retval; int i; char RecvArray[1024]={0}; //接收数据存储缓冲区 unsigned char RecvArray1[1024]={0};//格式转换后数据存储缓冲区 unsigned char RecvArray2[1024]={0};//校验后数据存储缓冲区 BOOL m_recflag=FALSE; CMonitorDoc *pDoc; CMonitorView *pView; CMainFrame *pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd); pView = (CMonitorView *)(pFrame->GetActiveView()); pDoc=(CMonitorDoc *)(pFrame->GetActiveDocument()); int len=sizeof(SOCKADDR); unsigned int Framelen=0; SOCKADDR_IN addr[10]; SOCKET sock[10]; if (0 == pView->ComNum) //简单防护 { return 0; } else { for (int a = 0; a < pView->ComNum; a++) { if (10 <= a) { break; } addr[a] = pView->ComArray[a].addrSrv; //ComArray数组存放着各UDP通道相关值 sock[a] = pView->ComArray[a].sockSrv; } } for(;;) { for (unsigned int m = 0; m < pView->ComNum; m++) { memset(RecvArray,0,1024); memset(RecvArray1,0,1024); memset(RecvArray2,0,1024); //接收数据 retval=recvfrom(sock[m],RecvArray,1024,0,(SOCKADDR*)&(addr[m]),&len); memcpy(RecvArray1,RecvArray,1024); //通信数据格式校验 for(i=0;i<=1023;i++) { if(/*帧头校验通过*/) { Framelen = /*通过数据协议取出对应数据计算通信数据包长度*/; if(1024 <= i+Framelen ) { break; //简单防护 } if(/*帧尾校验通过*/) { memcpy(RecvArray2,RecvArray1+i,Framelen); m_recflag=TRUE; break; } } } if(m_recflag==TRUE) { m_recflag=FALSE; /*此处解析接收到的数据协议*/ } } } for (unsigned int m = 0; m < pView->StationComNum; m++) { closesocket(pView->StationComArray[m].sockSrv); WSACleanup(); } }
[此贴子已经被作者于2020-9-9 09:44编辑过]