2011-02-25 19 views
5

एसिंक्रोनस कनेक्शन में टाइमर का एक पहलू है जो मैं जानना चाहता हूं कि मैं सही ढंग से समझता हूं या नहीं।कुछ स्पष्टीकरण की आवश्यकता है बूस्ट एएसआई एसिंक्रोनस ऑपरेशंस और टाइमर

मान लीजिए कि हम एक पठन ऑपरेशन करने से पहले एक टाइमर सेट करते हैं, जिसमें हैंडलर शामिल है, और फिर run() io_service।

जैसा कि मैंने समझ लिया है, io_service जैसे ही प्रबंधक लागू किए जाने के बाद समाप्त हो जाती है के रूप में समाप्त हो जाती है, जो दो कारणों से हो सकता है:

क) पढ़ा आपरेशन पूरा हो गया है।

बी) टाइमर इसकी सीमा तक पहुंच गया है।

मान लीजिए कि पहली (ए) स्थिति तक पहुंच गई है, और टाइमर समाप्त होने से पहले पठन ऑपरेशन पूरा हो चुका है।

सवाल यह है कि उस टाइमर का क्या होता है? क्या हमें इसे खत्म करने की ज़रूरत है। कहना

dTimer_.expires_from_now (boost::posix_time::seconds(0)); 

after the io_service.run()? 

आप एक नया अंतराल करने के लिए इसे रीसेट कर सकते हैं यदि आवश्यक हो तो एक और पढ़ने ऑपरेशन के लिए एक ही टाइमर वस्तु फिर से उपयोग करें?

क्या मैं io_service को रीसेट कर सकता हूं और उस नए ऑपरेशन के लिए एक ही run() में उसी ऑब्जेक्ट का पुन: उपयोग कर सकता हूं?

उत्तर

8

The question is: What happens to that timer? Do we need to finish it.

टाइमर के संचालक अभी भी सक्रिय किया जाएगा यदि आप नहीं cancel यह

void my_read_handler() { 
    dTimer_.cancel(); // remember to catch exceptions 
} 

async_wait handlerboost::asio::error::operation_aborted के error code पारित हो जाएगा अगर यह सफलतापूर्वक रद्द कर दिया गया है। async_waitcancel से पहले पूरा हो गया है और हैंडलर को पहले से ही io_service द्वारा कतारबद्ध किया गया है, तो आपके हैंडलर को उस स्थिति का पता लगाने और उचित प्रतिक्रिया देने की आवश्यकता होगी।


Can you reset it to a new interval if necessary re-use the same timer object for another read operation?

एक deadline_timer का उपयोग कर expires_from_now

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the boost::asio::error::operation_aborted error code.


Can I reset() the io_service and reuse the same object in a new run() for that new operation?

ही io_service वस्तु यह resetting के बाद run() या poll() के लिए फिर से इस्तेमाल किया जा सकता reset हो सकता है।

This function must be called prior to any second or later set of invocations of the run(), run_one(), poll() or poll_one() functions when a previous invocation of these functions returned due to the io_service being stopped or running out of work. This function allows the io_service to reset any internal state, such as a "stopped" flag.

+0

व्यापक जवाब है, +1 बढ़ावा :: asio :: त्रुटि के लिए :: operation_aborted – Ralf

+0

आप शामिल प्रक्रिया के अपने स्पष्ट और कुरकुरा विवरण के लिए बहुत बहुत, लेकिन अभी भी एक सवाल धन्यवाद: मेरी पहली परिदृश्य मान, अगर वहाँ एक पठन ऑपरेशन और टाइमर है, क्या पहली बार समाप्त होने पर io_service समाप्त होता है? भूतपूर्व? अथवा दोनों? –

+0

@ पुरानी नौसिखिया 'io_service :: रन()' कॉलर को नियंत्रण देता है जब कोई और काम नहीं होता है, यह [प्रलेखन] (http://www.boost.org/doc/libs/1_46_0 में अच्छी तरह से वर्णित है) /doc/html/boost_asio/reference/io_service/run/overload1.html)। आपके संदर्भ में इसका अर्थ यह है कि सभी बकाया हैंडलर, 'async_read' और' async_wait' दोनों को लौटने से पहले बुलाया जाएगा। अच्छी स्पष्टीकरण के लिए –

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