为什么我的线程起来会占用99%的CPU时间?(80分)

  • 主题发起人 主题发起人 labafa
  • 开始时间 开始时间
L

labafa

Unregistered / Unconfirmed
GUEST, unregistred user!
我试了最简单的线程
用TMyThread.Create(false);创建
procedure TMyThread.Execute;
begin
while not terminateddo
if (条件1) then
{do somthen
...}
end;
为什么即使条件不满足,什么也不做,也占99%CPU时间??
我觉得这好像是死循环了,是否应挂起?或者是要等待什么事件,请大家指教一下!!
 
加个Sleep(1000)吧
 
你这循环在一直等待条件,等于它一直运行,当然就占到99%了,如果你把条件改成信号变量,
这样就由系统决定什么时候唤醒线程,就不会占用时间了,当然如果对时间性要求不高,
最简单的办法就象上面

实现如下
初始化:
HANDLE hVar;
hVar = CreateEvent(NULL, FALSE, FALSE, NULL);
线程中写:
WaitForSingleObject(hVar, INFINITE);
在系统满足条件时候
SetEvent(hVar);
 
因你一直占用着系统资源。在程序等待时,把资源释放吧
 
怎么能这样写呢while not terminateddo

这不等于自杀程序吗?也只是只要此程序不关闭,就一直做循环体内的语句。
改了吧!
 
其实就和这个一样的道理
while 1<>0do
begin
///
end;

你试试,肯定死机的
 
上面的几位都说错了吧,线程程序就是这么写的,应该没问题,
还是程序体里有问题,比如没有同步调用VCL
 
在你的:
while not terminateddo
if (条件1) then
{do somthen
...}
^^^^^^^^^^^^^
do 内部加入 WaitMessage();语句试试.
 
sleep是最好的方法
 
 
你这循环在一直等待条件,等于它一直运行,当然就占到99%了,如果你把条件改成信号变量,
这样就由系统决定什么时候唤醒线程,就不会占用时间了,当然如果对时间性要求不高,
最简单的办法就象上面
线程程序就是这么写的,应该没问题,
我同意 huanGe ,无以前也这么写,30个工作线程,上千个客户端也没有达到100%,大概70%。
一个好的线程,关键在于你的等待挂起,消息触发,是否写的完美。线程就像你的孩子,也要你好关爱他。

线程中写:

while not terminateddo
begin
.
WaitForSingleObject(hVar, INFINITE);
//do....
end
.
.
.
在系统满足条件时候
SetEvent(hVar);
 
同意airhorse的,
to airhorse:你是一个高手吗?
 
我想在线程中使用死循环一点也没问题啊,因为我一直在这么做,只不过我的循环中
需要不停地申请中断,读文件,写文件,等写完了再关中断,可能是这几步操作需要
点时间吧,反正我没加Sleep,也是好好的。但上面几位老兄说的加个Sleep我想肯定
没问题,不过无需那么长吧,Sleep(1000),延迟1秒,也太夸张了吧,我想100就足够了。
还有,如果要求不是很高,我觉得把线程优先级改小应该也不错,比如改成 IDLE,总
不会死机一样吧
 
看看 msdn 关于 sleep。
public static native void sleep( long millis )
Causes the currently executing thread to sleep
(temporarily cease execution) for the specified number of milliseconds.
The threaddo
es not lose ownership of any monitors
当线程执行sleep(1000),线程并没有交出所有权,所以于事无补。
每当我看到 sleep函数的时候,我总会想起dos编程时代,那都是5,6年前的事了。很快是吗?
都过时了,sleep也一样。
我从不用sleep,你还不如用 替换WaitForSingleObject(hVar, 1000);因为他才真正挂起,
交出cpu控制权。
好好看 WaitForSingleObject(hVar, 1000);等相关的信号量控制函数,那是windows 多线程的精髓。
 
放sleep肯定不是办法,但放sleep的一个作用就是把需要同步的进程变相拉开了,
结果上达到了同步的时序。不过这肯定跟机器硬件速度相关了,不可取。
 
在系统满足条件时候
SetEvent(hVar);
是指在需要唤醒线程,要它干点事的时候SetEvent(hVar);吗?
hVar这个handle要在程序初始化的时候就创建吗?
 
前面回答了啊:
实现如下
初始化:
HANDLE hVar;
hVar = CreateEvent(NULL, FALSE, FALSE, NULL);
线程中写:
WaitForSingleObject(hVar, INFINITE);
在系统满足条件时候
SetEvent(hVar);
 
假如我要等待一外部变量为true 才继续执行下一条,该如何写?
 
那你等两条件全满足的时候才 SetEvent(hVar)
或者你用两事件变量不就可以了,每满足一个设置一个SetEvent(XXX);
 
谢谢各位的讨论。
 
to airhorse
探讨下 sleep
>当我看到 sleep函数的时候,我总会想起dos编程时代,那都是5,6年前的事了。很快是吗?
>过时了,sleep也一样。
do
s 不能分时间片,而windows能,所以二者效果似乎不一样吧.
附:
win32 help about sleep
You have to be careful when using Sleep and DDE.
If a thread creates any windows, it must process messages.
DDE sends messages to all windows in the system.
If you have a thread that uses a wait function with no time-out interval,
the system will deadlock. Therefore, if you have a thread that creates windows,
use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx,
rather than Sleep.

因此,如果涉及到在线程中创建窗体时须注意,可在线程中加application.procmessage,当然
遵循ms 建议,用 waitXXX 更好一些.
 

Similar threads

S
回复
0
查看
845
SUNSTONE的Delphi笔记
S
S
回复
0
查看
778
SUNSTONE的Delphi笔记
S
后退
顶部