Momentan verwende ich zusätzlichen Thread, um Speicher nach Thread freizugeben. Bevor Sie fragen. Nein, ich kann FreeOnTerminate nicht verwenden: = true, weil ich .waitfor brauche. Ich brauche auch FreeAndNil(), weil ich nur auf diese Weise überprüfen kann, ob der Thread mit Assigned() läuft. BeispielcodeWie FreeAndNill() nach der Beendigung des Threads automatisch ausgeführt wird
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;
Verwenden Ereignisse zu signalisieren, äh, Ereignisse –
Wenn die einzige Sache, die Sie wissen wollen, ob der Thread abgeschlossen ist, weisen Sie einen 'OnTerminate' Handler zum Thema. –
Ich muss darauf hinweisen, dass ein Thread, der von einem anderen Thread mit "SupervisorThread.WaitFor;" blockiert wird, scheint ein wenig sinnlos als Thread. Erinnern Sie sich, dass der Punkt von Threads Code _concurrently_ ausführen soll. Ihr Beispiel wirft die Fragen auf: Warum können Sie Cleaning nicht einfach am Ende des Supervisors ausführen? Warum müssen Sie das Reinigungsobjekt im Vordergrund erstellen? Kannst du nicht warten bis Supervisor fertig ist? Was passiert, wenn Sie die Reinigung beenden möchten? - Sie können nicht, weil es nicht in einer 'while not terminated' Schleife ist. –