यह प्रश्न मामूली प्रतीत हो सकता है, लेकिन मुझे उम्मीद है कि आप इसे अनदेखा नहीं करेंगे।
टीटीएचड ऑब्जेक्ट को नष्ट करने से पहले आमतौर पर टीटीएचड.एक्सक्यूट() विधि को समाप्त करने वाले थ्रेड तक प्रतीक्षा करना आवश्यक होता है, केवल तब ही हम यह सुनिश्चित कर सकते हैं कि, उदाहरण के लिए, कक्षा के विनाशक के अंदर नष्ट वस्तुओं को अब तक नहीं पहुंचाया जा सकता है । इसलिए टर्मिनेटेड फ्लैग को सेट करने के लिए टर्मिनल को कॉल करना आवश्यक है जिसे थ्रेड को यह जानने के लिए जांचना है कि बाहर निकलना है या नहीं, और फिर WaitFor() विधि को कॉल करें।
टीटीएचड ऑब्जेक्ट को नष्ट करने का एक उचित तरीका
क्योंकि धागा निलंबित किया जा सकता है, मुझे लगता है कि वेटफ़ोर को कॉल करने से पहले इसे फिर से शुरू करना अच्छा होता है, अन्यथा कॉलिंग थ्रेड को समाप्त कर दिया जाएगा। और क्योंकि धागे को कई बार निलंबित किया जा सकता है, इसे उसी समय फिर से शुरू किया जाना चाहिए, है ना?
while Suspended do
Resume;
धागा बनाया गया था तो निलंबित कर दिया है, हम में चिंता करने की है कि जब हम धागा केवल इसे समाप्त करने के लिए फिर से शुरू TThread.Execute() विधि बुलाया जाएगा की जरूरत नहीं है - यह (कृपया मुझे सही नहीं होगा अगर मैं गलत हूँ)।
मैं क्या कहा गया है प्रत्येक TThread वस्तु के लिए कोड की निम्न लाइनों का उपयोग कर मुक्त कर दिया जा रहा है पता चलता है:
MyThread.Terminate;
while MyThread.Suspended do
MyThread.Resume;
MyThread.WaitFor;
MyThread.Free;
दुर्भाग्य से, जब हम उस एक से अधिक थ्रेड पैदा कर दी है, के लिए कोड के इस तरह के एक टुकड़े लेखन हमारे आवेदन को नष्ट प्रत्येक टीटीएचड ऑब्जेक्ट को अनावश्यक रूप से नष्ट किया जा रहा है, कोड को बहुत लंबा और शायद अपारदर्शी भी बनाता है।
इसलिए मैं इस निष्कर्ष पर पहुंचा कि इन सभी को टीटीएचड क्लास के ओवरडिन विनाशक के अंदर रखा जा सकता है, जिसके लिए यह MyThread को कॉल करने के लिए पर्याप्त होगा। फ्री (या MyThread। अगर माई थ्रेड। फ्रीऑनटर्मिनेट सेट है तो देखभाल करें) इस बारे में कि नष्ट वस्तु एक टीटीएचड ऑब्जेक्ट है या नहीं:
destructor TMyThread.Destroy;
begin
//if FreeOnTerminate, the calling thread cannot wait for itself
if GetCurrentThreadId <> ThreadId then
begin
Terminate;
while Suspended do
Resume;
WaitFor;
end;
{free all objects created in this class}
inherited Destroy;
end;
मुझे ऐसे मूल प्रश्न पूछने के लिए क्षमा करें। हालांकि, मैं इस तरह के बारे में आपकी राय जानना चाहता हूं - मुझे उम्मीद है कि एक सार्वभौमिक तरीका - टीटीएचड ऑब्जेक्ट्स को नष्ट करना। मैं इस प्रश्न पूछता हूं क्योंकि मैंने अपने कार्यकर्ताओं के कोड से सीखा है कि वे आमतौर पर ऐसी वस्तुओं को नष्ट करने के लिए कोड के पहले उदाहरण का उपयोग करते थे, लेकिन उन्होंने यह जांचने के लिए कभी भी उपयोग नहीं किया था कि थ्रेड का इंतजार नहीं किया गया था, जिसे थ्रेड के रूप में थोड़ा खतरनाक माना जाता था कोड में कहीं निलंबित किया जा सकता है। इसलिए मैंने इस वर्ग की वस्तुओं को नष्ट करने का एक सार्वभौमिक तरीका खोजने की कोशिश की जो कोड को स्पष्ट और सुरक्षित बना देगा। मुझे उम्मीद है कि मैंने इसे और खराब नहीं किया - आपको क्या लगता है?
आपके सुझावों के लिए अग्रिम धन्यवाद।
हेमलेट के लॉर्ड पोलोनियस के शब्दों से एक अनुस्मारक: ब्रेवटी बुद्धि की आत्मा है – Argalatyr