TidThreadComponent 的循环 属性

Loop property of TidThreadComponent

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

TidThreadComponentLoop属性是什么意思?

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

名称 Loop 表示 Loop=true 应该使他的线程在循环中启动,直到手动终止。但是,还观察到其他情况。

提前感谢任何想法。

根据 TIdThread 的文档,TIdThreadComponent 包含:

Loop is a Boolean property used to indicate if the Run method for the thread instance is called in a loop.

When Loop contains True (the default value assigned in Create), the Run method will be continuously executed until Stopped returns True.

When Loop contains False, the Run method is called once during execution of the thread.

你问Loop=true是否应该使线程"start in the loop until terminated manually",但更准确的说法是线程的Run()方法循环直到线程停止,而不是终止。 Indy 中的两个不同概念。线程可以停止而不终止,这允许重新启动线程。例如,当使用 TIdSchedulerOfThreadPool.

TIdThread 停止 时,它将停止调用其 Run() 方法,然后将 Terminate()Suspend()本身,取决于其 StopMode 属性。默认为 smTerminate.

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;

所以,基本上可以归结为 Loop 控制在 BeforeRun()AfterRun() 之间调用 Run() 的次数,仅此而已。尽管如此,线程将继续调用 Run(),直到线程 stoppedterminated.