asio定期计时器

时间:2011-12-06 10:19:18

标签: c++ boost-asio

我想通过asio的计时器实现类似java的Timer,它用于定期执行代码。

#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;
}

程序只输出Hello,world!一次,等待那里。 asio doc有一个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;
}

1 个答案:

答案 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()尚未设置......