2010-08-22 229 views
11

我期待下面的代碼打印Hello,world!每5秒鐘一次,但會發生什麼情況是程序暫停5秒鐘,然後一遍又一遍地打印該消息,而沒有後續暫停。我錯過了什麼?boost 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'是爲了什麼?我評論過這個類和'CancelDeadline cd(d); boost :: thread thr1(cd);'和代碼仍然有效。 – javapowered 2013-05-03 08:14:29

+0

您可能會對此問題感興趣:http://stackoverflow.com/questions/21771639/can-i-use-a-stackful-coroutine-as-the-wait-handler-of-a-steady-timer-which -is-de – updogliu 2014-02-14 06:06:01

回答

23

您正在創建deadline_timer作爲局部變量,然後立即退出該功能。這將導致計時器破壞並取消自身,並用您忽略的錯誤代碼調用您的函數,導致無限循環。

使用存儲在成員或全局變量中的單個計時器對象應解決此問題。

2

如果你看錯誤代碼,你會得到操作取消錯誤。

+0

嗯,這很有趣,謝謝你指出。你爲什麼假設我得到手術取消的錯誤? – shaz 2010-08-22 00:51:41

+0

查看interjay的回覆。這完全解決了這個問題。 – 2010-08-22 02:26:42

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

小心添加任何類型的評論?有一個只有代碼的答案很少有助於提問者。 – 2013-08-27 00:42:12