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

Multithreading 当您终止()一个线程(类TThread)时,它是否会退出该线程的每个子线程?,multithreading,delphi,terminate,resume,Multithreading,Delphi,Terminate,Resume,我在Delphi中有一个代码,它执行以下操作: procedure THilo.Execute; // (which is the thread) begin inherited; FreeOnTerminate := True; while not Terminated do begin (...) Sleep(100); end; end; 现在在其他地方,在另一个线程(或GUI)中,我们执行以下操作: var Hilo2: THilo; begin

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

procedure THilo.Execute; // (which is the thread)
begin
  inherited;
  FreeOnTerminate := True;
  while not Terminated do
  begin
    (...)
    Sleep(100);
  end;
end;
现在在其他地方,在另一个线程(或GUI)中,我们执行以下操作:

var
  Hilo2: THilo;
begin
  Hilo2 := THilo.Create(True);
  Hilo2.start;
  Hilo2 := THilo.Create(True);
  Hilo2.start;
end;
现在我们已经对同一个线程执行了2次,它们是并行运行的。如果我们现在这样做会怎么样

  Hilo2.Terminate;
这会终止两个线程还是只终止1个线程? 另外,如果我们想终止它,我们可以通过.Resume()来实现吗


提前感谢

当您创建第二个线程时,您正在用指向第二个对象的指针覆盖局部变量
Hilo2
——第一个对象的指针丢失,您不再有任何对它的引用(或控制它的方法)。如果线程本身没有终止,那么这将导致内存泄漏,并且,不,调用terminate不会停止两个线程,只停止最后创建的引用该变量的线程。另外,在TThread的
Execute
方法中,不需要调用
inherited
——没有什么可以继承的(TThread的Execute方法是抽象的,它什么都不做)。

谢谢J,我的程序中有这个,并且无法终止线程,所以它只能用一个TThread数组来修复,对吗?比如'Hilo[i]:=THilo.Create(True);Hilo[i].启动`哦-另一个熟练的Delphi多线程开发人员。这使我们中至少有两个人:)另外,由于使用了
FreeOnTerminate=True
,如果线程过早终止(未捕获异常等),那么调用
Terminate()
FreeOnTerminate=True
应仅用于创建和忘记线程。一旦您出于任何原因(挂起/恢复、终止/等待、更新/访问成员等)必须从外部接触线程,请不要使用
FreeOnTerminate=True
!另一个问题-如果要使用
FreeOnTerminate=True
,请改为在构造函数中设置它(或者至少在
ACreateSuspended=True
时调用
Resume/Start()
之前)。这是因为几年前,
TThread
被更新为如果在线程实际开始运行之前调用了
Terminate()
,则根本不调用
Execute()
。如果
Execute()
设置
FreeOnTerminate=True
,您就有内存泄漏的风险。@MartinJames别这么傲慢了。