当你终止()一个线程(类TThread)时,它是否会退出该线程的每个子节点?

use*_*704 5 delphi resume multithreading terminate

我在Delphi中有一个代码,它执行以下操作:

procedure THilo.Execute; // (which is the thread)
begin
  inherited;
  FreeOnTerminate := True;
  while not Terminated do
  begin
    (...)
    Sleep(100);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

现在在其他地方,在另一个线程(或GUI)中我们这样做:

var
  Hilo2: THilo;
begin
  Hilo2 := THilo.Create(True);
  Hilo2.start;
  Hilo2 := THilo.Create(True);
  Hilo2.start;
end;
Run Code Online (Sandbox Code Playgroud)

现在我们已经执行了相同线程的2次,并且它们并行运行.如果我们现在这样做会怎么样?:

  Hilo2.Terminate;
Run Code Online (Sandbox Code Playgroud)

这将终止两个线程或只是1,或什么?另外,如果我们想终止它,我们可以通过.Resume()来实现吗?

提前致谢

J..*_*... 8

当你创建第二个线程时,你Hilo2用一个指向第二个对象的指针覆盖局部变量- 第一个对象的指针丢失,你不再对它有任何引用(或控制它的方式).如果线程没有自行终止,这将导致内存泄漏,不,调用terminate将不会停止两个线程,只有最后使用该变量创建的线程作为引用.此外,没有必要调用TThread inheritedExecute方法 - 没有任何东西可以继承(TThread的execute方法是抽象的,它不做任何事情).

  • @MartinJames别这么自大了. (7认同)
  • 另一个问题 - 如果你打算使用`FreeOnTerminate = True`,请在构造函数中设置它(或至少在`ResreateSuspended = True`时调用`Resume/Start()`之前).这是因为几年前,如果在线程实际开始运行之前调用`Terminate()`,`TThread`被更新为不会调用`Execute()`.如果`Execute()`设置`FreeOnTerminate = True`,则存​​在内存泄漏的风险. (4认同)
  • 此外,由于正在使用`FreeOnTerminate = True`,如果线程过早终止(未捕获的异常等),那么如果线程已经消失,则调用`Terminate()`可能会失败(或者更糟糕的是,损坏内存).`FreeOnTerminate = True`应仅用于创建并忘记线程.一旦你必须从外部触摸线程****任何**原因(暂停/恢复,终止/等待,更新/访问成员等),不要使用`FreeOnTerminate = True`! (3认同)