急求,线程提高CPU占用率。

liujun777 2007-04-27 11:08:13
程序为了实现消息时时更新
UINT ReceiveMsg(LPVOID pParam)
{
while(1)
{
m.list->AddString(str);//m_list 是ListBox控件变量 str为字符变量
}
return 0;
}
运行这个线程是为什么CPU 占用率达到50%.
...全文
352 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aj3423 2007-04-30
  • 打赏
  • 举报
回复
你原来的这样哪里不好
for(;;)
{

ret=sockSrvrUdp.ReceiveFrom(buff,100,ipStr,port);//IP和port均为返回值

if(buff[0]=='D') return 0;
if(ret==SOCKET_ERROR)
{
break;
}
msg.Format(buff);
pDlg->AddMsgList(ipStr,msg);
}
sockSrvrUdp.Close();
return 0;
}
justinm 2007-04-30
  • 打赏
  • 举报
回复
看来cpu是双核的.因为socket的有些函数是阻塞式的.
liujun777 2007-04-27
  • 打赏
  • 举报
回复
不加的话线程不是要终止了吗?在SOCKET编程中加就没事啊。
例如
/////UDP接受信息线程开始
UINT _UDPThread(LPVOID lparam)
{

CAaaDlg *pDlg=(CAaaDlg *)lparam;
if(pDlg->StopServer==true) return -1;

CSocket sockSrvrUdp;
sockSrvrUdp.Create(PORT+pDlg->m_client,SOCK_DGRAM);
char buff[100]={0};
int ret=0;
CString ipStr;
CString msg;
UINT port;
for(;;)
{

ret=sockSrvrUdp.ReceiveFrom(buff,100,ipStr,port);//IP和port均为返回值

if(buff[0]=='D') return 0;
if(ret==SOCKET_ERROR)
{
break;
}
msg.Format(buff);
pDlg->AddMsgList(ipStr,msg);
}
sockSrvrUdp.Close();
return 0;
}
wltg2001 2007-04-27
  • 打赏
  • 举报
回复
这个简单的函数能侦听到消息嘛,我始终觉得在函数里加一个死循环是有问题的。
liujun777 2007-04-27
  • 打赏
  • 举报
回复
我主要是想用这个线程侦听消息,有消息来就显示。
liujun777 2007-04-27
  • 打赏
  • 举报
回复
用Sleep函数会不会丢失数据?
僵哥 2007-04-27
  • 打赏
  • 举报
回复
程序为了实现消息时时更新
UINT ReceiveMsg(LPVOID pParam)
{
while(1)
{
m.list->AddString(str);//m_list 是ListBox控件变量 str为字符变量
}
return 0;
}
才占50%呀,你RP不错呀,一般会接近100%哟
===========================================
估计楼主的是双核,所以只占50%
wltg2001 2007-04-27
  • 打赏
  • 举报
回复
看你的代码好像是写在一个子线程里的吧,有必要嘛,写在定时器里不是更好一些。
wujiabao 2007-04-27
  • 打赏
  • 举报
回复
程序为了实现消息时时更新
UINT ReceiveMsg(LPVOID pParam)
{
while(1)
{
m.list->AddString(str);//m_list 是ListBox控件变量 str为字符变量
}
return 0;
}
才占50%呀,你RP不错呀,一般会接近100%哟
加个Sleep()吧;

UINT ReceiveMsg(LPVOID pParam)
{
while(1)
{
m.list->AddString(str);//m_list 是ListBox控件变量 str为字符变量
Sleep(100);//0.1秒
}
return 0;
}
wltg2001 2007-04-27
  • 打赏
  • 举报
回复
while(1)
{
m.list->AddString(str);//m_list 是ListBox控件变量 str为字符变量
}
这个函数没有出口啊,当然会占用CPU资源了,这不是个死循环嘛
liujun777 2007-04-27
  • 打赏
  • 举报
回复
我是说SOCKET中这种死循环没有出现占用率高的问题.
Email2k 2007-04-27
  • 打赏
  • 举报
回复
Socket分成阻塞式和非阻塞式,只有非阻塞式的Socket用死循环才会出现CPU占用率高的情况。
可以用别的方式如Select,异步IO或者完成端口等

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧