目前我正在使用额外的线程来很好地释放线程后的内存。 在你问之前。不,我不能使用FreeOnTerminate:= true,因为我需要.waitfor。 我也需要FreeAndNil(),因为只有这样我才能检查线程是否使用Assigned()运行。示例代码。创建线程时如何在线程终止后自动执行FreeAndNill()
private
procedure DoTerminateEvent(Sender: TObject);
var
isRunning: Boolean;
procedure TForm2.DoTerminateEvent(Sender: TObject);
begin
isRunning := False;
end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if (isRunning) then
begin
CanClose := false;
ShowMessage('Cannot close form because SupervisorThread is still working')
end else
CanClose := true;
end;
设置OnTerminate
处理:
procedure TForm1.Button1Click(Sender: TObject);
begin
SupervisorThread:= TSupervisorThread.Create(True);
SupervisorThread.FreeOnTerminate:=false; //MUST BE FALSE!
SupervisorThread.Priority := tpNormal;
SupervisorThread.Resume;
end;
procedure TSupervisorThread.Execute;
begin
CleaningThread:= TCleaningThread.Create(True);
CleaningThread.FreeOnTerminate:=true;
CleaningThread.Priority := tpNormal;
CleaningThread.Resume;
//some loops here
end;
procedure TCleaningThread.Execute;
begin
if Assigned(SupervisorThread)=true then
begin
SupervisorThread.WaitFor;
FreeAndNil(SupervisorThread);
end;
end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Assigned(SupervisorThread)=false then CanClose:=true
else
begin
CanClose:=false;
ShowMessage('Cannot close form because SiupervisorThread is still working');
end;
end;
使用的事件信号,呃,事件 –
如果你想的唯一的事情就是要知道如果线程完成后,分配'OnTerminate'处理器到线程。 –
我必须指出,一个线程被'SupervisorThread.WaitFor;'所阻塞的另一个线程看起来有点毫无意义。记住线程的要点是允许代码执行_concurrently_。您的示例引发了以下问题:为什么不能在Supervisor结束时运行清理?为什么你必须在前面创建清洁对象;你能等到主管完成吗?如果你想“终止”清洗会发生什么? - 你不能,因为它不是在'Terminated'循环中。 –