在TThread.Execute中放置无限循环是否被视为不良实践?

10

我写了一个Thread.descendent类,在execute方法中放置了一个无限循环以侦听com事件,使用无限循环来完成这个任务是否被认为是不好的线程实践?应用程序运行良好,不会冻结,并且始终响应,我只是回答因为我想使用最佳的线程方法。

procedure TMyThread.Execute;
begin
    while True and not Terminated do
    begin
     AResult:= FListener.GetResult(Param1,Param2,5000);
      if not VarIsNull(AResult) then
        Synchronize(Process);
    end;
end;

13
如果有一个结束循环的事件,那么它就不是真正的无限循环了,对吧? - drudge
如果没有事件,FListener.GetResult会等待吗? - David Heffernan
为了停止线程,我使用TMyThread.Terminate,请检查行while True and not Terminated do,在那里我检查线程是否已终止。 - Salvador
David,我更新了代码,监听器方法现在有一个超时参数,以毫秒为单位等待。 - Salvador
这仍然看起来像线程会一直旋转,这并不理想。但这不是你的问题! - David Heffernan
8
对于任何A来说,“true and A”与“A”是相同的东西。 - Andreas Rejbrand
2个回答

14
编译器将其转换为:
while not Terminated do

这样写出来,我相信你会同意它看起来非常自然。这是一个非常常见的习语。


7

这样做是可以的。你正在检查Terminated,这很好。如果你的监听器允许,并且你的CPU使用率过高,你可以通过在其中放置Sleep(1)来减慢线程速度,但我认为这不是必要的。


5
虽然从技术上讲没问题,但完全没有必要并且会使代码更难阅读。如@David Heffernan所指出的那样,True and not Terminated 等价于 'not Terminated',而第二种写法更容易理解。尽管这种写法是多余和无用的,但我不会给它投反对票。 - Ken White
1
是的。'true' 可以被移除。我的回答更多地关于在线程中使用 while 循环的一般用法,这才是这个问题实际上所涉及的。 - GolezTrol
1
我发现监听器本身有一个超时。这使得我在线程中添加额外的Sleep的建议变得不必要了。 - GolezTrol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接