2008-10-31 11 views
5

मेरे पास डेल्फी के साथ थ्रेडिंग समस्या है। मुझे लगता है कि यह अन्य भाषाओं में भी आम है। मेरे पास एक लंबी प्रक्रिया है जो मैं धागे में करता हूं, जो मुख्य विंडो में एक सूची भरती है। लेकिन अगर कुछ पैरामीटर औसत समय में बदलते हैं, तो मुझे वर्तमान निष्पादन धागे को रोकना चाहिए और शुरुआत से शुरू करना चाहिए। डेल्फी टर्मिनल सेट करके थ्रेड को समाप्त करने का सुझाव देता है: = सत्य और थ्रेड में इस चर के मान की जांच करना। हालांकि मेरी समस्या यह है कि लंबे समय तक निष्पादित भाग को लाइब्रेरी कॉल में दफनाया जाता है और इस कॉल में मैं टर्मिनेटेड वैरिएबल की जांच नहीं कर सकता। इसलिए मुझे इस लाइब्रेरी कॉल को समाप्त करने के लिए इंतजार करना पड़ा, जो पूरे कार्यक्रम को प्रभावित करता है।लंबी निष्पादन धागे को सावधानी से कैसे रोकें?

इस मामले में क्या करना पसंदीदा तरीका है? क्या मैं तुरंत धागे को मार सकता हूँ?

+1

लंबी अवधि वाली लाइब्रेरी कॉल क्या है? –

उत्तर

3

धागे को एक सुंदर शट डाउन प्राप्त करने के लिए सह-संचालन करने की आवश्यकता है। मुझे यकीन नहीं है कि क्या डेल्फी एक और थ्रेड को रोकने के लिए एक तंत्र प्रदान करता है, लेकिन ऐसे तंत्र .NET और जावा में उपलब्ध हैं, लेकिन अंतिम उपाय का विकल्प माना जाना चाहिए, और आवेदन की स्थिति का उपयोग करने के बाद अनिश्चित है।

यदि आप एक मनमानी बिंदु पर धागे को मार सकते हैं, तो आप स्मृति आवंटक (उदाहरण के लिए) में लॉक रखते हुए इसे मार सकते हैं। इससे आपके प्रोग्राम को उस लॉक तक पहुंचने की आवश्यकता होने पर लटकने के लिए खुल जाएगा।

9

पसंदीदा तरीका कोड को संशोधित करना है ताकि यह रद्दीकरण की जांच किए बिना अवरुद्ध न हो।

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

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

+0

यह एक अच्छी सलाह के रूप में लगता है।इस कॉल को किसी अन्य प्रक्रिया में बनाना इसे जब्त करने के बाद कोई निशान नहीं छोड़ेगा। – Glenner003

3

यदि आप समाप्ति की जांच के लिए कोड को संशोधित नहीं कर सकते हैं, तो बस इसकी प्राथमिकता वास्तव में कम करें, और इसे लौटने पर इसे अनदेखा करें।

0

मैं एक similar question के जवाब में यह लिखा है:

मैं एक अपवाद आधारित तकनीक कि Win32 आवेदनों की एक संख्या में मेरे लिए बहुत अच्छी तरह से काम किया है का उपयोग करें।

धागे को समाप्त करने के लिए, मैं QueueUserAPC का उपयोग फ़ंक्शन पर एक कतार को कतार में करने के लिए करता हूं जो अपवाद फेंकता है। हालांकि, को फेंक दिया गया अपवाद "अपवाद" प्रकार से नहीं लिया गया है, इसलिए केवल मेरे धागे की रैपर प्रक्रिया द्वारा पकड़ा जाएगा।

मैंने इसे सी ++ बिल्डर ऐप्स के साथ बहुत सफलतापूर्वक उपयोग किया है। मैं डेल्फी बनाम सी ++ अपवाद हैंडलिंग की सभी सूक्ष्मताओं से अवगत नहीं हूं, लेकिन मुझे उम्मीद है कि इसे आसानी से काम में संशोधित किया जा सकता है।

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