cpu占用率过高的问题
在程序中启用了一个线程,启用后cpu使用率达到80%,代码如下,高手帮忙分析下:
//********************************************************************
//启动接收线程
bool CUDPServer::StartRecv()
{
if(m_SckRecive==INVALID_SOCKET)
{
if(!CreateRecvSocket())
{
return false;
}
}
if(m_bReciveFlag)
{
return true;
}
m_RecvThread = CreateThread(NULL,0,OnReceiveThread,this,0,&m_ThreadID); //启动线程
if(m_RecvThread==NULL)
{
return false;
}
return true;
}
//********************************************************************
//停止接收线程
bool CUDPServer::StopRecv()
{
if(!m_bReciveFlag)
{
return true;
}
CLOSE_SOCKET(m_SckRecive);
if(m_RecvThread!=NULL)
{
WaitForSingleObject(m_RecvThread,INFINITE);
m_RecvThread = NULL;
m_ThreadID = 0;
}
return true;
}
//********************************************************************
//接收线程函数,
DWORD WINAPI CUDPServer::ReceiveThread(LPVOID lpParameter)
{
int addr_len;
struct sockaddr_in addr;
char szRecBuf[10000];
int iRecLen;
CUDPServer * pUDPServer;
pUDPServer = (CUDPServer *)lpParameter;
pUDPServer->m_bReciveFlag = true;
/*addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(pNetMultiCast->m_MultiCastPort);*/
while(pUDPServer->m_bReciveFlag)
{
addr_len = sizeof(addr);
iRecLen = recvfrom(pUDPServer->m_SckRecive,szRecBuf,10000,0,(struct sockaddr *)&addr,&addr_len);
if(iRecLen==SOCKET_ERROR||iRecLen<=0)
{
pUDPServer->m_bReciveFlag = false;
}
else
{
szRecBuf[iRecLen] = 0;
printf("Receive from %s :%s\n",inet_ntoa(addr.sin_addr),szRecBuf);
}
}
printf("Receive Thread Ended.\n");
return 0;
}
//********************************************************************
void CUDPServer::OnReceive(long length)
{
//length 是socket列队中的第一个报文长度
//在本函数中可以进行业务的处理
char *pbuf;
int addr_len,iRecLen;;
struct sockaddr_in addr;
pbuf = new char[length+1];
memset(pbuf,0,length+1);
addr_len = sizeof(addr);
iRecLen = recvfrom(m_SckRecive,pbuf,length,0,(struct sockaddr *)&addr,&addr_len);
if(iRecLen==SOCKET_ERROR||iRecLen<=0||iRecLen!=length)
{
// printf("Receive Failed!");
}
else
{
// CString str;
pbuf[length] = 0;
// str.Format("%s", pbuf);
// printf("Receive from %s :%s\n",inet_ntoa(addr.sin_addr),pbuf);
// TRACE("Recv fome %s:%s\n",inet_ntoa(addr.sin_addr),pbuf);
FILE *fp;
fp = fopen("log.txt","a");
fprintf(fp,"in onrecieve\n");
fprintf(fp,"%s\n",pbuf);
fclose(fp);
}
delete []pbuf;
pbuf = NULL;
}
//********************************************************************
DWORD WINAPI CUDPServer::OnReceiveThread(LPVOID lpParameter)
{
int ret;
unsigned long lLength;
CUDPServer * pUDPServer;
pUDPServer = (CUDPServer *)lpParameter;
pUDPServer->m_bReciveFlag = true;
while(pUDPServer->m_bReciveFlag)
{
ret = ioctlsocket(pUDPServer->m_SckRecive,FIONREAD,&lLength);
if(ret!=0)
{
pUDPServer->m_bReciveFlag = false;
}
else
{
if(lLength>0)
{
pUDPServer->OnReceive(lLength);
}
}
}
// printf("Receive Thread Ended.\n");
return 0;
}