首页 > 解决方案 > TidThreadComponent 的 Loop 属性

问题描述

我有一个(希望如此)简单的问题:

Loop属性的含义是TidThreadComponent什么?

我的线程程序在 Delphi 7 中编译时运行良好,但在 Delphi Embarcadero 下编译时线程工作不可预测。我怀疑 Loop的属性TidThreadComponent(在 Delphi 7 中不记得了)。

名字LoopLoop=true 应该让他的线程在循环中开始,直到手动终止。然而,观察到其他东西。

提前感谢您的任何想法。

标签: multithreadingdelphiindy

解决方案


根据 的文档TIdThread,其中TIdThreadComponent包含:

Loop 是一个布尔属性,用于指示是否在循环中调用线程实例的 Run 方法。

当 Loop 包含 True(在 Create 中分配的默认值)时,Run 方法将不断执行,直到 Stopped 返回 True。

当 Loop 包含 False 时,在线程执行期间调用一次 Run 方法。

你问是否Loop=true应该让线程“在循环中开始,直到手动终止”,但更准确的说法是线程的Run()方法是循环的,直到线程停止,而不是终止。Indy 中的两个不同概念。线程可以在不被终止的情况下停止,这允许线程重新启动。例如,当使用TIdSchedulerOfThreadPool.

当 aTIdThread停止时,它会停止调用它的Run()方法,然后会根据它的属性要么Terminate()或它自己要么它自己。默认值为.Suspend()StopModesmTerminate

TIdThreadComponent运行一个内部的TIdThread/Ex,它派生自TThread. 和 Delphi 线程的大多数用法一样,线程的Execute()方法运行一个while not Terminated循环。在该Terminated循环内,线程的Loop属性控制线程的Run()方法是在每次循环迭代中调用一次,还是在while not Stopped每次迭代时在其自己的循环中调用。换句话说,这之间的区别是:

while not Terminated do
begin
  if Stopped then
  begin
    if Terminated then Break;
    Suspend;
    if Terminated then Break;
  end;
  BeforeRun;
  Run; // <-- Loop=false
  AfterRun;
end;

和这个:

while not Terminated do
begin
  if Stopped then
  begin
    if Terminated then Break;
    Suspend;
    if Terminated then Break;
  end;
  BeforeRun;
  while not Stopped do Run; // <-- Loop=true
  AfterRun;
end;

因此,它基本上归结为控制在and之间调用Loop多少次,仅此而已。尽管如此,线程仍将继续调用,直到线程停止终止Run()BeforeRun()AfterRun()Run()


推荐阅读