2011-12-06 30 views
1

我想通過asio的定時器來實現類似java的定時器,它用於定期執行代碼。asio週期性定時器

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

void print() 
{ 
    std::cout << "Hello, world!\n"; 
} 

class WorldTimer 
{ 
public: 
    boost::posix_time::ptime now() 
    { 
     return _timer.expires_at(); 
    } 
    void update() 
    { 
     _f(); 
     _timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000)); 
     _timer.async_wait(boost::bind(&WorldTimer::update, this)); 
    } 
    WorldTimer(boost::asio::io_service& io, void (*f)()) : _f(f), _timer(io){} 
private: 
    void (*_f)(); 
    boost::asio::deadline_timer _timer; 
}; 

int main() { 
    boost::asio::io_service io; 
    WorldTimer timer(io, print); 
    timer.update(); 
    io.run(); 
    return 0; 
} 

程序只輸出你好,世界!一次並在那裏等待。 asio文檔有一個example,它的工作原理,但我無法弄清楚有什麼區別。

是的......定時器尚未初始化一個到期時間,這是修訂版:

class WorldTimer 
{ 
public: 
    boost::posix_time::ptime now() 
    { 
     return _timer.expires_at(); 
    } 
    WorldTimer(boost::asio::io_service& io, void (*f)()) : _f(f), _timer(io, boost::posix_time::microseconds(0)) 
    { 
     _timer.async_wait(boost::bind(&WorldTimer::update, this)); 
    } 
private: 
    void (*_f)(); 
    boost::asio::deadline_timer _timer; 
    void update() 
    { 
     _f(); 
     _timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000)); 
     _timer.async_wait(boost::bind(&WorldTimer::update, this)); 
    } 
}; 

int main() { 
    boost::asio::io_service io; 
    WorldTimer timer(io, print); 
    io.run(); 
    return 0; 
} 

回答

2

你的最後期限計時器的構造是從一個在的例子不同。你需要explicitly set the expiry time。 示例代碼使用設置particular expiry time relative to now的其他構造函數。

所以,你看到的是與你的呼叫update,它調用

_timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000)); 

_timer.expires_at()還尚未設置打印出來...

+1

BTW,我要問什麼會定時器到期但上次處理程序仍在運行時發生? – jean