MFC 9个线程socket通信,cpu使用率太高,怎么破 10
小弟初学MFC,最近编了一个基于socket通信的传送图片的程序。线程代码如下:程序中我做了注释,以方便大家阅读。当我开9个下面这样的线程后,cpu使用率就达到了90%以...
小弟初学MFC,最近编了一个基于socket通信的传送图片的程序。线程代码如下:
程序中我做了注释,以方便大家阅读。
当我开9个下面这样的线程后,cpu使用率就达到了90%以上。
//线程连接函数传入参数是一个类的对象,对象中包含很多控制图像显示的信息变量
UINT LinkThreadProc(LPVOID pParam)
{
CThreadInfo *t_tmp=(CThreadInfo*)pParam;
if(!t_tmp->bTerminate)
{
CString aa=t_tmp->pstr; // 另一个函数扫描到的 "ip地址/计算机名称"
int iFind=aa.Find('/');
CString ipdata=aa.Left(iFind);
t_tmp->socketclient = socket(AF_INET,SOCK_STREAM,0);
int addr_len;
addr_len=sizeof(SOCKADDR);
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons( 3000 );
serveraddr.sin_addr.S_un.S_addr = inet_addr(ipdata); //将字符串转换为32位二进制网络字节序的IPV4地址
int ret(0);
if(ret=connect(t_tmp->socketclient,(SOCKADDR*)&serveraddr,addr_len)!=0) //connect成功,则返回0
{
t_tmp->display=FALSE;
AfxMessageBox(“显示失败”);
return 1;
}
while(!t_tmp->bTerminate) {
ofstream out(t_tmp->strPath11,fstream::out|fstream::binary);
char sTempCommand[3];
memset(sTempCommand,0,3);
char buf[1024]={0};
while(1)
{
ret=recv(t_tmp->socketclient,buf,1024,0); //returns the number of bytes received
if (ret==SOCKET_ERROR)
{
t_tmp->display=FALSE; //diaplay为true时才能显示图像
pRight->DrawPic(); //显示图片函数
AfxMessageBox(“主机连接不上”);
t_tmp->bTerminate=TRUE;
closesocket(t_tmp->socketclient);
return 0;
}
strncpy(sTempCommand,buf,2);
if (strcmp(sTempCommand,"OK") != 0 && ret>0) //如果收到了OK即发送一张图片结束,跳出循环。
{
out.write(buf,sizeof(char)*ret);
}
else
{
out.close();
break;
}
}
Sleep(500);
CopyFile(t_tmp->strPath11,t_tmp->strPath111,FALSE);//复制图片
pRight->DrawPic(); //图片显示函数
}
return 0;
}
return 0;
}
大家说这是什么原因导致的cpu使用率那么大?是线程的问题么?夤夜发帖实属无奈,希望百度的朋友们给予一些帮助。 展开
程序中我做了注释,以方便大家阅读。
当我开9个下面这样的线程后,cpu使用率就达到了90%以上。
//线程连接函数传入参数是一个类的对象,对象中包含很多控制图像显示的信息变量
UINT LinkThreadProc(LPVOID pParam)
{
CThreadInfo *t_tmp=(CThreadInfo*)pParam;
if(!t_tmp->bTerminate)
{
CString aa=t_tmp->pstr; // 另一个函数扫描到的 "ip地址/计算机名称"
int iFind=aa.Find('/');
CString ipdata=aa.Left(iFind);
t_tmp->socketclient = socket(AF_INET,SOCK_STREAM,0);
int addr_len;
addr_len=sizeof(SOCKADDR);
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons( 3000 );
serveraddr.sin_addr.S_un.S_addr = inet_addr(ipdata); //将字符串转换为32位二进制网络字节序的IPV4地址
int ret(0);
if(ret=connect(t_tmp->socketclient,(SOCKADDR*)&serveraddr,addr_len)!=0) //connect成功,则返回0
{
t_tmp->display=FALSE;
AfxMessageBox(“显示失败”);
return 1;
}
while(!t_tmp->bTerminate) {
ofstream out(t_tmp->strPath11,fstream::out|fstream::binary);
char sTempCommand[3];
memset(sTempCommand,0,3);
char buf[1024]={0};
while(1)
{
ret=recv(t_tmp->socketclient,buf,1024,0); //returns the number of bytes received
if (ret==SOCKET_ERROR)
{
t_tmp->display=FALSE; //diaplay为true时才能显示图像
pRight->DrawPic(); //显示图片函数
AfxMessageBox(“主机连接不上”);
t_tmp->bTerminate=TRUE;
closesocket(t_tmp->socketclient);
return 0;
}
strncpy(sTempCommand,buf,2);
if (strcmp(sTempCommand,"OK") != 0 && ret>0) //如果收到了OK即发送一张图片结束,跳出循环。
{
out.write(buf,sizeof(char)*ret);
}
else
{
out.close();
break;
}
}
Sleep(500);
CopyFile(t_tmp->strPath11,t_tmp->strPath111,FALSE);//复制图片
pRight->DrawPic(); //图片显示函数
}
return 0;
}
return 0;
}
大家说这是什么原因导致的cpu使用率那么大?是线程的问题么?夤夜发帖实属无奈,希望百度的朋友们给予一些帮助。 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询