关于在线程中使用死循环的问题。(100分)

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

lcl_003

Unregistered / Unconfirmed
GUEST, unregistred user!
我要和另外一台机器进行通讯,为了不影响通讯我使用了线程,因为要定时通讯所以在线程
里使用了goto,但是我发现如果我一创建这个线程cpu的占用率就是100%,打开窗体也变慢了
不知道是不是因为线程的原因,这样做可以吗?或者有什么好的办法?
procedure MyThread.Execute;
var
time0,time1:integer;
label start1;
begin
time0:=timegettime();
start1:
time1:=timegettime();
if time1-time0>200 then
begin
do
something.........(和另外一台机器通讯)

end;

goto start1;
end;
 
procedure MyThread.Execute;
begin
freeOnTerminate := true;
while( not terminated)do
begin

{
do
something...
}
sleep(200);
end;
end;
 
哦,BBKSOFT, 你的方法好:)不过这样会对系统速度有影响吗?
 
sleep让线程暂时停止,转出cpu给其他的线程使用,对系统速度是否有影响就看你
如何设计了,通常这样可以降低cpu的负荷。
 
在线程里做死循环CPU占用率很高,应该在适当的时刻sleep一下,比如与主机暂时没有通信
时。
 
哦,明白。那在死循环里加上判断到某个条件就停止线程该怎么写?
 
当然是线程的原因,不能这样用的.
线程在没事做时应该被suspend而不是做死循环,在有事时再把它resume,否则当然要占用CPU了.
 
可以在 死循环里加 self.terminate();
来跳出循环,或者用 break;
跳出循环;
我建议用break;
zai/
 
在线程外建议用 object.terminate();
 
对系统基本没什么影响,
sleep()过后,相当于你把
时间给其他程序了。
你可以试验一下sleep(1);
其实sleep(1)=sleep(2)=...=slep(30)...
因为 windows系统的休息时间
至少 为 30 毫秒
 
你的程序好象仅在第一此循环时间隔200豪秒。
 
多人接受答案了。
 
后退
顶部