![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
mfc 运行时 cpu占用太高 直接%100 求帮助 5
我做的是一个MFC的聊天程序本来各各客户端用的是tcp我为了减小程序的负担就改为了UDP期初就是因为cpu占有点高觉的改为UDP会好点通信原理是和qq一样就是各clien...
我做的是一个MFC 的聊天程序 本来各各客户端用的是tcp 我为了减小程序的负担就改为了UDP 期初就是因为cpu占有点高 觉的改为UDP 会好点 通信原理是 和qq一样 就是各client登陆服务器从服务器上得到各各 登陆用户和注册用户的信息回传给各client 而后client就由client状态 变为服务器 来接收别的client对他发出的连接,而后他们相互通信 这时 服务器只是当有新的用户登陆时 以tcp的形通知 client 或者广播信息 期间在各客户端退出前与服务器都保持连接 我用一个线程作为与服务器保持通信的线程 一个用与监听新到连接(就是客户端 ) 现在程序做的都差不多了 可是cpu占有高的问题 一直在心头想弄好贴上 客户端监听 代码 请各位同仁 帮忙 谢谢了
UINT client::accect_to(LPVOID pParam)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
int err = WSAStartup( wVersionRequested, &wsaData );//加载套接字库
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
SOCKET socket1;
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(atoi(allmess[0].port)); ///监听端口
local.sin_addr.s_addr=htonl(INADDR_ANY); ///本机
socket1=socket(AF_INET,SOCK_DGRAM,0);
bind(socket1,(struct sockaddr*)&local,sizeof local);
char *token;
while (1)
{
char buffer[1024]="\0";
char c[10000]="\0";
int nTimeOut = 3000;// 超时值为3s
setsockopt(socket1, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut,sizeof(nTimeOut));
// 超时值为3s
setsockopt(socket1, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut,sizeof(nTimeOut));
if (recvfrom(socket1,c,sizeof(c)+1,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
{
AfxMessageBox(c);
token = strtok(c, ":");
for(int i=0;i<listcount;i++)
{
if ((strcmp(token, allmess[i].name))== 0)
{token = strtok(NULL, ":");
if(allmess[i].winstu==1)
{chat1::reflesh(c);
}
else
{
allmess[i].win=new chat1();
allmess[i].winstu=1;
allmess[i].win->socket1=socket1;
sprintf(allmess[i].win->ip, "%s", inet_ntoa(from.sin_addr));
sprintf(allmess[i].win->port, "%d", ntohs(from.sin_port));
allmess[i].win->fromlen=fromlen;
//char edit[10000];=
//allmess[i].win->m_shuchu=edit;
allmess[i].win->m_shuchu=c;
CWinThread *th =AfxBeginThread(chatshow,allmess[i].win);
//
//AfxMessageBox("ddd222");
}
}
}
}
Sleep(1);
////给cilent发信息
//sendto(socket1,buffer,sizeof(buffer)+1,0,(struct sockaddr*)&from,fromlen);
}//while
closesocket(socket1);
return 0;
} 展开
UINT client::accect_to(LPVOID pParam)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
int err = WSAStartup( wVersionRequested, &wsaData );//加载套接字库
if ( err != 0 ) {
return 0;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
SOCKET socket1;
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(atoi(allmess[0].port)); ///监听端口
local.sin_addr.s_addr=htonl(INADDR_ANY); ///本机
socket1=socket(AF_INET,SOCK_DGRAM,0);
bind(socket1,(struct sockaddr*)&local,sizeof local);
char *token;
while (1)
{
char buffer[1024]="\0";
char c[10000]="\0";
int nTimeOut = 3000;// 超时值为3s
setsockopt(socket1, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut,sizeof(nTimeOut));
// 超时值为3s
setsockopt(socket1, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut,sizeof(nTimeOut));
if (recvfrom(socket1,c,sizeof(c)+1,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
{
AfxMessageBox(c);
token = strtok(c, ":");
for(int i=0;i<listcount;i++)
{
if ((strcmp(token, allmess[i].name))== 0)
{token = strtok(NULL, ":");
if(allmess[i].winstu==1)
{chat1::reflesh(c);
}
else
{
allmess[i].win=new chat1();
allmess[i].winstu=1;
allmess[i].win->socket1=socket1;
sprintf(allmess[i].win->ip, "%s", inet_ntoa(from.sin_addr));
sprintf(allmess[i].win->port, "%d", ntohs(from.sin_port));
allmess[i].win->fromlen=fromlen;
//char edit[10000];=
//allmess[i].win->m_shuchu=edit;
allmess[i].win->m_shuchu=c;
CWinThread *th =AfxBeginThread(chatshow,allmess[i].win);
//
//AfxMessageBox("ddd222");
}
}
}
}
Sleep(1);
////给cilent发信息
//sendto(socket1,buffer,sizeof(buffer)+1,0,(struct sockaddr*)&from,fromlen);
}//while
closesocket(socket1);
return 0;
} 展开
2个回答
展开全部
试一试跟踪程序,看一看Sleep(1); 是否被执行,如果Sleep(1)不被执行,CPU占用率会很高。
追问
Sleep(1) 在那咱情况下不执行呢
追答
除了检测链接,就应该执行Sleep。网络方面不是很了解,另外举一个例子:
在一个子线程里面不断检测串口的例子,在循环里面用while循环检测:
while(1)
{
if(checkCom());//如果函数checkCom()函数返回1,表示有com有数据到达,需要处理数据
{
handleData();//处理接收到的数据
}
else
{
sleep(10);//如果函数checkCom()函数返回0,说明没有数据需要处理,使线程休眠。
}
}
如果象下面这样,CPU占用率会很高
while(1)
{
if(checkCom());//如果函数checkCom()函数返回1,表示有com有数据到达,需要处理数据
{
handleData();//处理接收到的数据
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询