2009-11-06 14 views
5

मैं पृष्ठभूमि धागे के आधार पर अंतःस्थापित कार्यों को कार्यान्वित करना चाहता हूं। TTask.Stop विधि को लागू करने का सबसे साफ तरीका क्या है? मैं पृष्ठभूमि धागे को कैसे रोक सकता हूं?धागे को छोड़ दें?

थ्रेड संदर्भ के भीतर निष्पादित कोड को अज्ञात विधि का उपयोग करके कार्य में पास किया जाता है और इसमें ब्लॉकिंग कॉल हो सकती है, इसलिए मैं इस तथ्य पर भरोसा नहीं कर सकता कि Terminated ध्वज नियमित रूप से कोड के भीतर से चेक किया जाता है।

किसी भी इनपुट के लिए धन्यवाद।

D2010 मामले में यह मायने रखता है (TThread में कुछ चीजें बदल गई लगते हैं)

उत्तर

7

कोई रास्ता सुरक्षित रूप से चल रहे एक धागा निरस्त करने के लिए नहीं है का उपयोग करना। विंडोज प्रोग्राम के लिए यह सच है चाहे डेल्फी में लिखा गया हो या नहीं, और क्या डेल्फी 2010 या इससे पहले का उपयोग करना है। यदि आप इसे कॉल करना चाहते हैं तो यह एक ओएस सीमा है, लेकिन असल में यह थ्रेडिंग की सीमा है, यह सुनिश्चित किए बिना धागे को निरस्त करने के रूप में यह ताले नहीं रख रहा है या ऐसा कुछ आपके प्रोग्राम के साथ विनाश को खत्म कर देगा।

आप क्या कर सकते हैं TerminateThread() एपीआई फ़ंक्शन को कॉल करना है, जो बुरा है। इस लिंक में समस्याओं और चेतावनियों की सूची पढ़ें और देखें कि क्या आप अभी भी इसे कॉल करना चाहते हैं। कोई अन्य तरीका नहीं है जो कार्य कोड से सहयोग के बिना काम करता है।

7

नौकरी को एक अलग प्रक्रिया में अलग करें। पृष्ठभूमि नौकरी के साथ आप कैसे संवाद करते हैं, इस पर निर्भर करते हुए, यह गारंटी देने का सबसे अच्छा तरीका है कि आप इसे साफ कर सकते हैं।

उदाहरण के लिए, शायद संचार के लिए साझा स्मृति का उपयोग करने के लिए यह एक अच्छा विचार नहीं है; फाइलों या पाइपों का उपयोग करें, या एक समान तंत्र जो दूसरे छोर को मारने पर तोड़ या स्टाल नहीं करता है। यदि आप क्रॉस-प्रोसेस सिंक्रनाइज़ेशन के लिए नामित म्यूटेक्स का उपयोग करते हैं, तो ध्यान रखें कि इन सिंक्रनाइज़ेशन प्राइमेटिव्स के लिए एक विशेष त्रुटि स्थिति है: WAIT_ABANDONED वेटफॉरसिंगल ऑब्जेक्ट और दोस्तों द्वारा लौटाया जाता है यदि थ्रेड (या, निहित, प्रक्रिया का मुख्य धागा) जो कि अंतिम रूप से था इसे साफ रूप से जारी किए बिना समाप्त कर दिया गया। असल में, इसका मतलब है कि आपको डेटा हस्तांतरण के लिए एक चरणबद्ध लेनदेन दृष्टिकोण का उपयोग करने की आवश्यकता है, ताकि आप संभावित रूप से असंगत स्थिति को अनदेखा कर सकें जिसे समाप्ति के समय संशोधित किया जा रहा था।

+0

यह एक अच्छा (+1) उत्तर है; सीएफ पाइथन थ्रेडिंग, जहां ग्लोबल इंटरप्रेटर लॉक से काफी कुछ बनाया गया है जो थ्रेड सुरक्षा (अच्छा) दोनों के लिए ज़िम्मेदार है और सभी व्यावहारिक उद्देश्यों के लिए बहु-कोडित कोड को एक कोर (खराब) तक सीमित करता है। उस समस्या का सबसे अच्छा समाधान धागे का उपयोग नहीं करना है, बल्कि मल्टीप्रोसेसिंग पैकेज के माध्यम से प्रक्रिया करता है, और कई मशीनों में स्केल करने की इस तत्काल क्षमता से प्राप्त किया जाता है, जो अंततः बड़े स्केलिंग के लिए आवश्यक हो जाता है। थ्रेड सुरक्षा के बारे में चिंता करने के बजाय, डेल्फी में आसान (आसान) मल्टीप्रोसेस प्रबंधन होना बेहतर होगा। –

+0

सेमफोरस में "त्याग" राज्य नहीं है क्योंकि उनके पास स्वामित्व की कोई अंतर्निहित धारणा नहीं है। (जहां तक ​​ओएस का संबंध है, एक धागा एक सेमफोर "पकड़" नहीं सकता है।) केवल एक म्यूटेक्स को जासूसी से छोड़ दिया जा सकता है। –

+0

ब्लॉकिंग कोड के साथ इंटरप्टिबल कार्यों को लागू करने का यह एक अच्छा तरीका हो सकता है, हालांकि मुझे नहीं लगता कि प्रश्न में कार्यक्षमता (अनाम विधियों के लिए एक विघटनकारी कार्य) को डेल्फी के साथ इस तरह कार्यान्वित किया जाना चाहिए। अज्ञात विधि से निष्पादन योग्य (एक अलग प्रक्रिया के रूप में उत्पन्न होने के लिए) बनाने के लिए रनटाइम कंपाइलर होना आवश्यक होगा, है ना? – mghie

संबंधित मुद्दे