Şu anda iş parçacığından sonra güzel boş bellek için ek iş parçacığı kullanıyorum. Sormadan önce. Hayır FreeOnTerminate kullanamıyorum: = true çünkü ihtiyacım var. Ayrıca FreeAndNil() 'a da ihtiyacım var çünkü sadece bu şekilde iş parçacığı Assigned() kullanarak çalışıp çalışmadığını kontrol edebilirim. Örnek kod Konu oluştururken Set OnTerminate
işleyicisiİplik sonlandırıldıktan sonra FreeAndNill() otomatik olarak nasıl yürütülür
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;
:
SupervisorThread := TSupervisorThread.Create(True);
...
SupervisorThread.OnTerminate := DoTerminateEvent;
SupervisorThread.Resume;
Veya Konudaki yapıcısına bir parametre olarak iletin:
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;
Etkinlikleri kullanan olayları, er, –
sinyal, bir 'OnTerminate' işleyicisi atamak iş parçacığına. –
"SupervisorThread.WaitFor;" ile başka bir iş parçacığı tarafından engellenen bir iş parçacığı bir iş parçacığı gibi biraz anlamsız görünüyor. Iş parçacığı noktasını unutmayın kodun _concurrently_ yürütmesine izin vermektir. Örneğiniz şu sorulara yalvarıyor: Neden Süpervizör'ün sonunda Temizlik'i çalıştırmıyorsunuz? Temizleme nesnesini neden yukarı oluşturmanız gerekiyor? Süpervizör tamamlanana kadar bekleyemez misin? 'Terminate' Temizleme yapmak istiyorsanız ne olur? - Yapamazsın çünkü "Terminated" değilken bir "" değil. –