2012-08-23 30 views
5

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

जब उपयोगकर्ता बटन दबाता है तो लिखें ऑपरेशन किया जाता है।

पढ़ने के लिए, एक अलग थ्रेड बनाया गया है। उपलब्ध लाइब्रेरी के साथ समस्या यह है कि रीड कॉल अवरुद्ध है और इसमें इन्फिनिट टाइमआउट है।

कनेक्शन विफलता के मामले में, यह थ्रेड रीड फ़ंक्शन कॉल पर अटक जाता है क्योंकि यह फ़ंक्शन केवल तभी टूट जाता है जब यह डेटा प्राप्त करता है।

इस तरह के परिदृश्य में इस धागे को मारने का तरीका क्या हो सकता है? Thread.Abort() काम नहीं कर रहा है।

मैं इस प्रोग्रामिंग के लिए सी # का उपयोग कर रहा हूं।

+1

"कस्टम पुस्तकालय" प्रदान नहीं करता है * किसी * एक अवरुद्ध एक असफल कनेक्शन पर पढ़ रद्द करने के लिए इसका मतलब है, आप इसे दूर ईमानदारी से फेंक और कुछ अलग करने का उपयोग करना चाहिए। – Clemens

+0

मुझे पता है .... मेरी इच्छा है कि मैं कर सकता हूं ... लेकिन सी # के डिफ़ॉल्ट सीरियल पोर्ट क्लास के साथ ऐसा ही मामला है ... यदि मैं टाइमआउट को इन्फिनेट सेट करता हूं तो ऑपरेशन असफल कनेक्शन पर फंस जाएगा। – Swanand

+0

आप जो कुछ भी पढ़ने की कोशिश कर रहे हैं उसे "हैंडल" बंद करने का प्रयास कर सकते हैं ... तो पढ़ा जाएगा रद्द कर दिया जाएगा मुझे लगता है ... और आपका धागा इस बात पर निर्भर करता है कि यह कैसे लिखा जा सकता है। –

उत्तर

1

आपकी पढ़ाई विधि शायद मूल कोड को कॉल करती है ताकि धागा निरस्त न हो। COM इंटरऑप का उपयोग करने वाले धागे को निरस्त करने के लिए कोई रास्ता नहीं है (कम से कम मैं परिचित हूं)। आप देख सकते हैं कि रीड विधि पहली जगह थ्रेड अवरुद्ध क्यों है। रीड विधि कॉल करने से पहले आवश्यकताओं की जांच करने का प्रयास करें।

इस सवाल पर एक नज़र डालें: Abort call to unmanaged DLL

+0

इसे एक अलग प्रक्रिया में चलाना वह था जो मैं विचार कर रहा था। मैं यह भी सोच रहा था कि आप किसी अन्य ऐप डोमेन में खतरनाक कोड चलाने में सक्षम हो सकते हैं, जिसे मैंने सोचा था कि आप "सिर में शूट" करने में भी सक्षम हो सकते हैं ... लेकिन यह थ्रेड समस्या को रोकने के लिए समान विफलता से पीड़ित है: http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx –

+0

विचार के लिए धन्यवाद! लेकिन अलग प्रक्रिया में केवल एक धागा कैसे चलाया जाए? या एक अलग प्रक्रिया के रूप में एक समारोह चल रहा है ?? – Swanand

+0

आप एक अन्य एप्लिकेशन बना सकते हैं जो COM इंटरऑप (यूएसबी संचार) से संबंधित है और उस प्रक्रिया को प्रक्रिया के रूप में शुरू करें। फिर आप उस प्रक्रिया के साथ पाइप्स http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx के माध्यम से संवाद कर सकते हैं –