2010-03-13 21 views
5

मेरा मतलब है, मान लीजिए कि आप एक एसिओ टाइमर पर async_wait करते हैं और एक ऐसे फ़ंक्शन को अपडेट जोड़ते हैं जो किसी प्रकार का संदर्भ लेता है। मान लीजिए कि आपने शुरुआत में टी को एसिंक_वाइट में जाने से पहले स्टैक पर बनाया था। As ascc_wait के अंत में, यह टाइमर ओवर और ओवर को नवीनीकृत करते हुए async_wait स्वयं को कॉल करता है। क्या स्टैक आवंटित प्रकार टी जीवित रहता है जब तक टाइमर खुद को नवीनीकृत नहीं करता है, या समारोह के पहले आमंत्रण के बाद टी टी गुंजाइश से बाहर हो जाएगा?एक एएसओ टाइमर दायरे से बाहर कब जाता है?

+0

वास्तविक कोड कृपया? :) – vladr

+0

अच्छा होगा अगर आप बेहतर समझा सकते हैं कि आप async_wait() का उपयोग कैसे करना चाहते हैं। शायद कुछ कोड या मेटा कोड द्वारा। आपको शायद छोटे_डक्स उत्तर में ऐसा करने की आवश्यकता है और इसे अन्य कार्यों में पारित करने के लिए टाइमर बनाएं और जो प्रभाव आप चाहते हैं उसे प्राप्त करें। – jpyllman

उत्तर

0

मुझे एएसओ टाइमर के साथ कोई अनुभव नहीं है। लेकिन यदि आप

void somefunc(void) 
{ 
    boost::asio::io_service io; 

    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
} 

फिर फ़ंक्शन से बाहर निकलने पर टाइमर गुंजाइश से बाहर है। तो इस कोड के साथ कभी इंतजार नहीं है। यदि आप उस कोड में t.wait() जोड़ते हैं तो यह 5s का इंतजार करेगा और फ़ंक्शन से बाहर निकल जाएगा और टाइमर गुंजाइश से बाहर होगा।

void somefunc(void) 
{ 
    boost::asio::io_service io; 

    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(somecallback); 

    io.run(); 
} 

दूसरे उदाहरण में टाइमर बाहर निकलने पर गुंजाइश से बाहर हो जाता है।

यदि आप टाइमर के चारों ओर लूप करना चाहते हैं तो मुझे लगता है कि आपको इस तरह लिखना है।

void somefunc(void) 
{ 
    boost::asio::io_service io; 

    while(something) 
    { 
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(somecallback); 

    io.run(); 
    } 
} 

जो लूप में एक मोड़ के लिए टाइमर को स्टैक पर रखेगा, और फिर इसे फिर से बनाया जाएगा। यदि आप लूप के बाहर टाइमर डालते हैं तो यह कभी भी गुंजाइश से बाहर नहीं जायेगा। लेकिन फिर आपको लूप में कभी भी इसे किसी भी तरह से रीसेट करना होगा। लेकिन मुझे ऐसा कोई काम नहीं दिख रहा है।

संपादित: async_wait() के उदाहरण में, टाइमर क्षेत्र से बाहर, नष्ट हो जाएगा, सीधे खत्म बिना अगर आप io.run() यह प्रतीक्षा करने के लिए नहीं है। और मुझे लगता है कि deadline_timer() के desructor टाइमर को रद्द कर देगा जब यह विनाशक मारा।

8

यदि आप एक फ़ंक्शन लिखना चाहते थे जिसमें आप स्टैक पर टाइमर बनाते हैं, तो async_wait को कॉल करें, फ़ंक्शन कॉल के अंत में टाइमर नष्ट हो जाएगा, और कॉलबैक तुरंत उचित त्रुटि पैरामीटर के साथ बुलाया जाएगा।

आप बूस्ट :: बाइंड का उपयोग करके कॉलर ऑब्जेक्ट को कॉलबैक पर पास नहीं कर सकते, क्योंकि ऑब्जेक्ट गैर कॉपी करने योग्य है।

फिर भी, आप अपने कॉलर को ढेर पर प्रबंधित कर सकते हैं, प्रत्येक कॉल पर async_wait पर एक साझा पॉइंटर पास कर सकते हैं। यह इस तरह दिखेगा:

void MyClass::addTimer(int milliseconds) // Initial timer creation call 
{ 
    boost::shared_ptr<boost::asio::deadline_timer> t 
    (new boost::asio::deadline_timer 
    (m_io_service, 
     boost::posix_time::milliseconds(milliseconds))); 
    // Timer object is being passed to the handler 
    t->async_wait(boost::bind(&MyClass::handle_timer, 
          this, 
          t, 
          milliseconds)); 

} 

void MyClass::handle_timer(boost::shared_ptr<boost::asio::deadline_timer> & t, 
           int milliseconds) 
{ 
    // Push the expiry back using the same tick 
    t->expires_at(t->expires_at() + boost::posix_time::milliseconds(milliseconds)); 
    t->async_wait(boost::bind(&MyClass::handle_timer, 
          this, 
          t, 
          milliseconds)); 
    onTimer(); // Do something useful 
} 
संबंधित मुद्दे