2011-12-06 27 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