![]() |
#2
rjsp2020-09-09 10:16
|
我的软件要和多个软件进行通信,假如有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编辑过]