2010-08-22 16 views
11

मुझे उम्मीद है कि नमस्ते, दुनिया को प्रिंट करने के लिए नीचे दिए गए कोड की उम्मीद है! प्रत्येक 5 सेकंड, लेकिन क्या होता है कि प्रोग्राम 5 सेकंड के लिए रुक जाता है और उसके बाद किसी भी विराम के साथ संदेश को ऊपर और ऊपर प्रिंट करता है। मैं क्या खो रहा हूँ?बूस्ट asio deadline_timer

#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

using namespace boost::asio; 
using namespace std; 

io_service io; 

void print(const boost::system::error_code& /*e*/) 
{ 
    cout << "Hello, world!\n"; 
    deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(print); 
} 


int main() 
{ 

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

    io.run(); 

    return 0; 
} 

नीचे कार्य कोड जोड़ने के लिए संपादित करें। धन्यवाद दोस्तों।

#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 
#include <boost/asio.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

using namespace boost::asio; 
using namespace std; 

class Deadline { 
public: 
    Deadline(deadline_timer &timer) : t(timer) { 
     wait(); 
    } 

    void timeout(const boost::system::error_code &e) { 
     if (e) 
      return; 
     cout << "tick" << endl; 
     wait(); 
    } 

    void cancel() { 
     t.cancel(); 
    } 


private: 
    void wait() { 
     t.expires_from_now(boost::posix_time::seconds(5)); 
     t.async_wait(boost::bind(&Deadline::timeout, this, boost::asio::placeholders::error)); 
    } 

    deadline_timer &t; 
}; 


class CancelDeadline { 
public: 
    CancelDeadline(Deadline &d) :dl(d) { } 
    void operator()() { 
     string cancel; 
     cin >> cancel; 
     dl.cancel(); 
     return; 
    } 
private: 
    Deadline &dl; 
}; 



int main() 
{ 
    io_service io; 
    deadline_timer t(io); 
    Deadline d(t); 
    CancelDeadline cd(d); 
    boost::thread thr1(cd); 
    io.run(); 
    return 0; 
} 
+0

क्या 'CancelDeadline' के लिए है? मैंने इस वर्ग और 'रद्द करेंडलाइन सीडी (डी) पर टिप्पणी की है; बढ़ावा :: धागा thr1 (सीडी); 'और कोड अभी भी काम करता है। – javapowered

+0

आपको इस प्रश्न में रुचि हो सकती है: http://stackoverflow.com/questions/21771639/can-i-use-a-stackful-coroutine-as-the-wait-handler-of-a-steady-timer-which -इस-डी – updogliu

उत्तर

23

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

किसी सदस्य या वैश्विक चर में संग्रहीत एक टाइमर ऑब्जेक्ट का उपयोग करके इसे ठीक करना चाहिए।

2

आप त्रुटि कोड को देखें, तो आप कार्रवाई रद्द की त्रुटियों हो रही है।

+0

हम्म, यह दिलचस्प है और इसे इंगित करने के लिए धन्यवाद। आपको लगता है कि मुझे ऑपरेशन रद्द करने की त्रुटियां क्यों मिल रही हैं? – shaz

+0

इंटरजे की प्रतिक्रिया देखें। यह पूरी तरह से समस्या को हल करता है। –

2
#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

using namespace boost::asio; 
using namespace std; 

io_service io; 

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

void print(const boost::system::error_code& /*e*/) 
{ 
    cout << "Hello, world!\n"; 
    t.expires_from_now(boost::posix_time::seconds(5)); 
    t.async_wait(print); 
} 


int main() 
{ 

    //deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(print); 

    io.run(); 

    return 0; 
} 
+3

किसी भी तरह की टिप्पणियां जोड़ने की देखभाल? एक जवाब है कि केवल कोड ही शायद ही कभी सवाल पूछने में मदद करता है। –

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