फिलहाल मैं थ्रेड के बाद अच्छी तरह से मुक्त मेमोरी के लिए अतिरिक्त थ्रेड का उपयोग कर रहा हूं। पूछने से पहले। नहीं, मैं FreeOnTerminate का उपयोग नहीं कर सकता: = सत्य क्योंकि मुझे चाहिए। Waitfor। मुझे FreeAndNil() की भी आवश्यकता है क्योंकि केवल इस तरह से मैं जांच सकता हूं कि असाइन() का उपयोग करके थ्रेड चल रहा है या नहीं। उदाहरण कोड ,थ्रेड समाप्ति के बाद स्वचालित रूप से FreeAndNill() को निष्पादित करने के लिए कैसे करें
SupervisorThread := TSupervisorThread.Create(True);
...
SupervisorThread.OnTerminate := DoTerminateEvent;
SupervisorThread.Resume;
या धागे के निर्माता के लिए एक पैरामीटर के रूप में इसे पारित: जब धागा बनाने OnTerminate
हैंडलर
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;
सेट करें:
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' हैंडलर आवंटित धागे के लिए। –
मुझे यह इंगित करना होगा कि एक थ्रेड जो 'पर्यवेक्षक थ्रेड.एटफ़ोर;' के साथ किसी अन्य थ्रेड द्वारा अवरुद्ध हो जाता है, थ्रेड के रूप में थोड़ा व्यर्थ लगता है। थ्रेड के बिंदु को याद रखें कोड को _concurrently_ निष्पादित करने की अनुमति देना है। आपका उदाहरण प्रश्न पूछता है: आप सुपरवाइजर के अंत में सफाई क्यों नहीं कर सकते? आपको सफाई वस्तु को सामने क्यों बनाना है; पर्यवेक्षक होने तक आप इंतजार नहीं कर सकते? यदि आप 'टर्मिनेट' सफाई करना चाहते हैं तो क्या होगा? - आप ऐसा नहीं कर सकते क्योंकि यह 'समाप्त नहीं होने पर' लूप में नहीं है। –