多线程while do导致cpu使用率很高

dqwdqwwoailuo 2010-12-29 04:02:30
环境是D7
新建一个空程序就在线程里

while true do
inc(i);


就这样,CPU就50%了 而同样代码 VC则不会

尝试过 加SLEEP(1) 有效果 但因为要捕包 所以不允许有任何 睡眠

在线程 create时候 降低优先级 没任何效果

请教高手了 谢谢
...全文
757 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
天之雪狐 2011-04-02
  • 打赏
  • 举报
回复
这是我的解决方法,我的软件和你差不多,也需要类似定时抓包的功能,

const
CThreadPauseTime = 10;
...
procedure TLeonSuRockeyThread.Execute;
begin
while (not Terminated) do
begin
if FPaused then
begin
Sleep(CThreadPauseTime * 1000);
end;
FTime := (GetTickCount - FStartTime) div 1000;
if FTime >= CThreadPauseTime then
begin
FStartTime := GetTickCount;
Synchronize(DoOnTime);
end;
if (not Terminated) then
Sleep(CThreadPauseTime * 1000);
end;
end;
...

结论就是用Slepp能达到我满意的效果(CPU占用 0%),但有一定的小技巧。
lhy 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 dqwdqwwoailuo 的回复:]
环境是D7
新建一个空程序就在线程里

while true do
inc(i);


就这样,CPU就50%了 而同样代码 VC则不会

尝试过 加SLEEP(1) 有效果 但因为要捕包 所以不允许有任何 睡眠

在线程 create时候 降低优先级 没任何效果

请教高手了 谢谢
[/Quote]
没有不允许任何睡眠的程序。
如果不允许任何睡眠那你就应该同时不允许其他程序分到任何时间片,那就死机了。
肯定需要sleep的。
mjp1234airen4385 2010-12-30
  • 打赏
  • 举报
回复
Sleep(1)
Jekhn 2010-12-30
  • 打赏
  • 举报
回复
sleep(0):
Remarks
A thread can relinquish the remainder of its time slice by calling this function with a sleep time of zero milliseconds.
  • 打赏
  • 举报
回复
你可以看一下孙鑫的《VC++深入详解》第15和16章,有详细的说明
  • 打赏
  • 举报
回复
不好意思,刚查了下书,记错了,是Sleep(1)表示放弃下一次时间片,Sleep(0)不知行不行。
dqwdqwwoailuo 2010-12-30
  • 打赏
  • 举报
回复
那请问楼下楼上的 假如

线程里

while true do
begin
inc(i);
sleep(0);
end;

这样可以有效降低CPU占用高么

还有 我的捕包是用 winpcap 来 循环捕的,貌似自带没 事件 - -。。
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dqwdqwwoailuo 的回复:]
Sleep(0) 请问这个 会 起到延迟效果吗? 0 哦
[/Quote]
会的,Sleep(0)函数表明该线程放弃下一次时间片,如果加个具体的数字如Sleep(100),表明在100ms内该线程都会放弃时间片,win32的线程时间片一般是20-25ms,所以100ms会放弃4或5次时间片让其他子线程执行,这不是太精确,理论是这样,实际会有一点偏差。
Jekhn 2010-12-30
  • 打赏
  • 举报
回复
Sleep(0)告诉系统切换CPU时间片,就是把当时CPU时间片切换到其它线程去执行,也是会起到延迟效果。
dqwdqwwoailuo 2010-12-30
  • 打赏
  • 举报
回复
Sleep(0) 请问这个 会 起到延迟效果吗? 0 哦
OO_is_just_P 2010-12-30
  • 打赏
  • 举报
回复
while True do
begin
Inc(i);
Application.ProcessMessage;
end;
  • 打赏
  • 举报
回复
如果你是多线程的程序,线程函数使用了循环(for、while等)就必须要加上Sleep(0),否则最先进入循环的子线程会抢占所有子线程时间片,其他子线程可能很长时间或者根本得不到时间片而无法正常执行,而且这和delphi无关,vc也是一样的,就像ls说的,最好使用事件驱动。
myfirenze 2010-12-29
  • 打赏
  • 举报
回复
while True do
begin
Inc(i);
Application.HandleMessage;
end;
dqwdqwwoailuo 2010-12-29
  • 打赏
  • 举报
回复
请问楼上 “消息循环”怎么个做法 能给个例子吗
ahejn 2010-12-29
  • 打赏
  • 举报
回复
没有sleep或者消息循环,CPU占用高肯定的,如果你是单核的,恐怕要占用100%了。
dqwdqwwoailuo 2010-12-29
  • 打赏
  • 举报
回复
回2L的 我觉得不关代码问题 因为我直接 创建个新的空窗体 然后只有一个线程

tmyThread := TmyThread.Create(True);
tmyThread.Resmue;

线程里只有

while true do
inc(i);

就这样 CPU就50了哦 救命啊 大侠们
keeley20 2010-12-29
  • 打赏
  • 举报
回复
楼主代码贴全,大家才好给你测试测试。
ahejn 2010-12-29
  • 打赏
  • 举报
回复
根据你的情况自己写个message loop吧,不过感觉如果你对实时性要求那么高的话,最好用事件驱动机制而不是查询。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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