我有一个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;
现在我们已经执行了两次相同的线程,它们正在并行运行。如果我们现在这样做会发生什么呢?
Hilo2.Terminate;
这会同时终止两个线程还是只有一个?如果我们想要终止它,能通过 .Resume() 实现吗?
提前感谢。
Hilo[i] := THilo.Create(True);
Hilo[i].start;
- user2308704FreeOnTerminate=True
,如果线程意外终止(未捕获的异常等),那么如果线程已经消失,则调用Terminate()
可能会失败(或更糟糕的是,导致内存损坏)。FreeOnTerminate=True
应该只用于创建并忘记的线程。一旦你必须因为 任何原因(挂起/恢复、终止/等待、更新/访问成员等)外部触摸一个线程,就不要使用FreeOnTerminate=True
! - Remy LebeauFreeOnTerminate=True
,请在构造函数中设置它(或至少在ACreateSuspended=True
时调用Resume/Start()
之前)。这是因为几年前,更新了TThread
,如果在线程实际开始运行之前调用Terminate()
,则根本不会调用Execute()
。如果Execute()
设置了FreeOnTerminate=True
,则可能会导致内存泄漏。 - Remy Lebeau