2012-02-08 14 views
7

मेरे पास boost::thread है जो boost::asio::serial_port पर सिंक्रोनस रीड करता है। जब मैं कक्षा के एक उदाहरण को नष्ट करता हूं जिसमें दोनों शामिल होते हैं, तो मैं चाहता हूं कि थ्रेड को सुन्दर तरीके से समाप्त करना पड़े, भले ही इसे रीड कॉल में अवरुद्ध किया गया हो। मैं यह कैसे कर सकता हूँ?बूस्ट पर सिंक्रोनस पढ़ने को अनब्लॉक करें :: asio :: serial_port

docs पर देखकर, मैंने cancel पर प्रयास किया, लेकिन यह केवल एसिंक्रोनस रीड/लिखने के लिए काम करता है। तब मैंने close की कोशिश की, लेकिन मुझे अपवाद मिला और यह वह प्रकार नहीं था जिसे आप पुनर्प्राप्त कर सकते हैं। शायद send_break या native_handle का उपयोग कर रहे हैं? (यह विंडोज है और पोर्टेबिलिटी महत्वपूर्ण नहीं है)

अद्यतन: मैं भी stopio_service मैं सीरियल पोर्ट वस्तु के निर्माता के लिए पारित करने की कोशिश की, लेकिन read अनब्लॉक नहीं था।

संपादित: अपवाद वास्तव में "catchable" है, लेकिन मैं एक नाशक के अंदर एक आज़माएं/कैच ब्लॉक डाल करने के लिए नफरत चाहते हैं, और कोड पुनर्रचना शटडाउन प्रक्रिया करने के लिए नाशक के बाहर के क्षेत्र में परिवर्तन की बहुत सारी ट्रिगर करेगा ऊपरी परतें तो अगर मैं कुछ बूस्ट अथॉरिटी कहता हूं कि कोई दूसरा रास्ता नहीं है तो मैं केवल इस समाधान के लिए जाऊंगा।

उत्तर

5

सिंक्रोनस पढ़ने को अनवरोधित करने का कोई तरीका नहीं है जैसा आप पूछते हैं।

  • उपयोग अतुल्यकालिक पढ़ता

    • close/shutdown पोर्ट और एक अपवाद है, जो उठाया गया था पकड़ने और cancel उन्हें, जब आप बंद अपने आवेदन

    :

    पास दो विकल्प हैं सबसे पहले, ज़ाहिर है, यह एक अच्छा विचार नहीं है, क्योंकि आप त्रुटि को एप्लिकेशन से समाप्त करने में अंतर नहीं कर सकते हैं।

  • +2

    गिरा दिया और वह बूस्ट क्यों boost :: एसियो नहीं बुलाया जाता है :: SioAndAsio :) –

    +0

    तुम्हारा मतलब है को बढ़ावा देने :: asio :: serial_port या पढ़ने के लिए तुल्यकालिक लिखा नहीं होती है? मैं मतदान से बचने के लिए तुल्यकालिक पढ़ने/लिखने के लिए गया ... अगर वे मुझे इस तरह से पढ़ने और लिखने की अनुमति देते हैं, जो आश्चर्यजनक रूप से काम करता है और सीपीयू चक्रों को बर्बाद नहीं करता है, तो उन्हें शानदार तरीके से समाप्त करने का एक तरीका प्रदान करना चाहिए। –

    +0

    हां, मैं कुछ दिन पहले ऐसा करना चाहता था। –

    1

    करीब, आप कहते हैं कि आपको एक अपवाद मिलता है कि 'जिस तरह से आप ठीक नहीं हो सकते थे'।

    इसका क्या अर्थ है?

    समाधान अपवाद को पकड़ने के लिए प्रतीत होता है। आप ऐसा क्यों नहीं कर सकते?

    इस मामले के लिए जब आप किसी त्रुटि और प्रोग्राम समाप्ति के बीच अंतर करना चाहते हैं, तो बंद होने से पहले प्रोग्राम समाप्ति पर ध्वज सेट करें। अपवाद हैंडलर (पकड़) में ध्वज की जांच करें। यदि सेट है, प्रोग्राम समाप्ति के रूप में संभाल लें, अन्यथा त्रुटि के रूप में संभाल लें।

    आप कहते हैं कि आप एक विनाशक के अंदर एक कोशिश/पकड़ ब्लॉक नहीं रखना चाहते हैं। यह मेरे लिए एक अजीब पूर्वाग्रह की तरह प्रतीत होता है, लेकिन ठीक है अन्य तरीके भी हैं।

    1. आप अपवाद को अपने सभी कोड से घिरे शीर्षतम पकड़ ब्लॉक तक पहुंचने की अनुमति दे सकते हैं, और इसे वहां संभाल सकते हैं। (आपके पास अपने पूरे एप्लिकेशन की सुरक्षा करने वाला ऐसा प्रयास/पकड़ ब्लॉक है, बेशक :-)

    2. अन्य तरीकों से भी संभव है ...लेकिन मालिक बस द्वारा

    +0

    मैंने वास्तव में अपवाद को अनदेखा किया और डीबगर में जारी रखा, लेकिन चूंकि यह एक विनाशक के अंदर हुआ, इसलिए मुझे बहुत परेशान किया गया और वहां एक कोशिश/पकड़ ब्लॉक भी लगा। मैं विनाशक के बाहर ऐसा करने के लिए अपने कोड को दोबारा कर सकता हूं, लेकिन यह विनाशकों की कॉल की कई परतों को उतार देगा और बहुत परेशान होगा। मैं इसे केवल अंतिम उपाय समाधान के रूप में स्वीकार करूंगा। मैंने तदनुसार अपना प्रश्न संपादित किया। –

    +0

    विनाशकों में अपवादों के बारे में, [नुकसान हैं] (http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.9)। लेकिन मुझे लगता है कि faq में वर्णित खतरनाक परिदृश्य लागू नहीं होता है। इसके अलावा, मैंने बूस्ट-यूजर मेल सूची में पूछा और उन्होंने मुझे 'boost :: asio :: error :: operation_aborted' पकड़ने के लिए कहा, जो मुझे त्रुटि से शट डाउन को अलग करने की अनुमति देता है, मुझे विश्वास है। मैं इसे आज़माउंगा और यदि यह काम करता है तो मैं आपका जवाब स्वीकार करूंगा। –

    +0

    मैंने 'std :: अपवाद 'पकड़ने की कोशिश की और रनटाइम चेक विफलता # 0 में चला गया (ईएसपी का मूल्य संरक्षित नहीं था या ऐसा कुछ नहीं था)। मैंने छोड़ दिया और async_read का उपयोग करने का निर्णय लिया और + बूस्ट विंडोज इवेंट को ब्लॉकिंग पढ़ने और लिखने के बराबर लिखने के लिए लिखा। –