सुरक्षित रूप से फिर से शुरू हो रहा है इस प्रश्न में डेल्फी और एक्सई विशेष रूप से सस्पेंड और फिर से शुरू करने से वंचित है। मैंने अन्य पदों को पढ़ा है और मुझे अब तक एक समान उपयोग नहीं मिला है, इसलिए मैं आगे बढ़ने जा रहा हूं और चर्चा के लिए कहूंगा।स्वयं डेल्फी में एक थ्रेड को निलंबित कर रहा है जब इसकी आवश्यकता नहीं है और
क्या मैं जानना चाहता हूं कि थ्रेड को रोकने के लिए एक बेहतर तरीका है जब इसकी आवश्यकता नहीं है?
हमारे पास एक डेल्फी वर्ग है जिसे हमने वर्षों से उपयोग किया है जो मूल रूप से एक फीफो कतार है जो थ्रेडेड प्रक्रिया से जुड़ा हुआ है। कतार मुख्य थ्रेड पर डेटा ऑब्जेक्ट स्वीकार करती है और यदि थ्रेड निलंबित कर दिया जाता है तो यह फिर से शुरू हो जाएगा।
थ्रेड की निष्पादन प्रक्रिया के हिस्से के रूप में ऑब्जेक्ट कतार से बाहर हो गया है और धागे पर संसाधित किया गया है। आमतौर पर यह डेटाबेस लुकअप करना है।
प्रक्रिया के अंत में ऑब्जेक्ट की एक संपत्ति को अद्यतन किया गया है और मुख्य धागे के लिए उपलब्ध के रूप में चिह्नित किया गया है या किसी अन्य कतार में भेजा गया है। निष्पादन प्रक्रिया का आखिरी (अच्छी तरह से यह वास्तव में पहला है) चरण यह जांचना है कि कतार में कोई और चीजें हैं या नहीं। यदि यह जारी है, अन्यथा यह खुद को निलंबित कर देता है।
वे कुंजी केवल एकमात्र निलंबन कार्रवाई निष्पादित लूप के अंदर होती है जब यह पूरा हो जाती है, और सामान्य संचालन के दौरान केवल एक ही फिर से शुरू होता है जब कतार में एक नया आइटम रखा जाता है। अपवाद तब होता है जब कतार वर्ग समाप्त हो रहा है।
फिर से शुरू करने वाला फ़ंक्शन ऐसा कुछ दिखता है।
process TthrdQueue.MyResume();
begin
if Suspended then begin
Sleep(1); //Allow thread to suspend if it is in the process of suspending
Resume();
end;
end;
निष्पादित इस
process TthrdQueue.Execute();
var
Obj : TMyObject;
begin
inherited;
FreeOnTerminate := true;
while not terminated do begin
if not Queue.Empty then begin
Obj := Pop();
MyProcess(Obj); //Do work
Obj.Ready := true;
end
else
Suspend(); // No more Work
end; //Queue clean up in Destructor
end;
के समान दिखता है TthrdQueue पुश ढेर में किसी अन्य वस्तु को जोड़ने के बाद नियमित कॉल MyResume। MyResume केवल तभी जारी किया जाता है जब थ्रेड निलंबित हो जाता है।
जब हम बंद करते हैं तो हम सत्य को समाप्त कर देते हैं और इसे निलंबित होने पर MyResume को कॉल करते हैं।
मैं कोई विशेषज्ञ नहीं हूं लेकिन मैं अधिक सटीक नियंत्रण के लिए बस स्लीप (250) या सिग्नल ऑब्जेक्ट एंडवाइट (एमएसडीएन देखें) का उपयोग करता हूं। –