有关多线程太占CPU资源的问题。。。(50分)

  • 主题发起人 主题发起人 ArFly
  • 开始时间 开始时间
A

ArFly

Unregistered / Unconfirmed
GUEST, unregistred user!
问一问个位大翁,我这个线程执行体为什么会占CPU资源的90%以上??我是仿SPCOMM的写线程来做的。
procedure TWriteThread.Execute;
var
msg: TMsg;
begin
While (Not Terminated)do
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
if (Msg.hwnd <> 0) then
begin
TranslateMessage(msg);
DispatchMessage(msg);
Continue;
end;
case msg.message of
CWM_WRITEDATA:
begin
Self.HandleWriteData(PVCI_CAN_OBJ(msg.wParam),msg.lParam);
LocalFree(HLOCAL (msg.wParam));
end;
end;
end;
end;
end;
 
while 里添个sleep就可以降下来了
 
TO 来如风, 加SLEEP是可以,,但是我觉得这不是解决问题的根本,呵呵。。有没有更好的方法??
TO ALL,
不知有没有人去看过SPCOMM的TWriteThread的线程执行体,,为什么他的不用加SLEEP,都不会占CPU资源呢???
 
sleep或waitforsingleobject都可以释放cpu经过测试发现其二者原理应该是一样的不像有些人说的waitforsingleobject更精确
 
这是由于线程长时间占用cpu,可以加入sleep,强制线程交出cpu使用权
 
鍑嗗?缁撹创浜嗭紝锛屼笉鏋滀笉鐭ユ
 
把PeekMessage改成GetMessage
两者的区别在于:
GetMessage在队列时里没有消息时会自动挂起线程
而PeekMessage在没有消息时会继续往下执行
 
你线程里面没有阻塞式的函数,这样线程会不断循环,占用率肯定高。
用Sleep不是好方法,因为可能会接受消息会延迟,用阻塞式的GetMessage代替PeekMessage,再没有消息的时候,会一直停在GetMessage的函数那里,等待消息,CPU时间片就可以交给别的程序。
这种 while not Terminateddo
形式的线程,循环里面一定要有阻塞式的函数,否则CPU占用率肯定高。
 
借个地方学习一下。
我在线程中执行循环,线程执行时是100%。有没办法把CPU占有率降下来呢?
用PeekMessage怎么得到消息呢?我加了这句后根本不执行。
 
PeekMessage在空闲的时候并不挂起线程,如果对于应用程序空闲的话,你需要用waitmessage来挂起线程。看看api以及delphi vcl源码就清楚了。delphi中没有用getmessage而是用了peekmessage + waitmessage。
 
线程长时间占用cpu
 
已经证实的葵花宝典
我们做串口通信软件,线程24小时运行,只要在代码中加上sleep(1),
CPU占用率几乎不超过5%,但是如果通信不正常,CPU占用率才会高一点。
 
还是用sleep(1),这对串行通信来说,延迟可以忽略,另外交出线程再回到线程,本身也有延迟效果。
 
多人接受答案了。
 

Similar threads

后退
顶部