【问题标题】:Is it considered bad practice to put an infinite loop inside of TThread.Execute?在 TThread.Execute 中放置无限循环是否被认为是不好的做法?
【发布时间】:2011-03-03 21:05:01
【问题描述】:

我写了一个 Thread.descendent 类,在执行方法中我放了一个无限循环来监听一个 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;

【问题讨论】:

  • 如果有一个事件终止了循环,那现在就不是无限的了吧?
  • 如果没有事件,FListener.GetResult 是否等待?
  • 要停止我使用TMyThread.Terminate 的线程,请检查while True and not Terminated do 行,我检查线程是否已终止。 `
  • 大卫,我更新了代码,监听器方法有一个超时参数,以毫秒为单位等待。
  • true and A 与任何AA 相同。

标签: multithreading delphi


【解决方案1】:

编译器将其转换为:

while not Terminated do

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 虽然技术上没问题,但它完全没有必要,而且会使代码更难阅读。正如@David Heffernan 指出的那样,True and not Terminated 等同于“未终止”,第二个更容易阅读。 (不过,不要投反对票,因为它在技术上是可以的,尽管它是多余的和无用的。)
    • 是的。可以删除“真实”。我的回答更多的是关于线程中while循环的一般用法,这就是这个问题的实际意义。
    • 我看到监听器本身有一个超时。这使得我的建议在线程中添加额外的睡眠是不必要的。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-04-12
    • 2012-01-05
    • 2011-04-10
    • 2018-08-11
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多