Asio周期定时器

asio periodic timer

本文关键字:定时器 周期 Asio      更新时间:2023-10-16

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

#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文档有一个例子,它可以工作,但我不知道有什么不同。

是的…计时器没有设置过期时间,这是修改后的版本:

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

您的截止日期计时器构造函数与示例中的构造函数不同。您需要显式地设置过期时间。示例代码使用另一个构造函数来设置相对于现在的特定过期时间。

因此,您看到的打印输出与您对update的调用有关,CC_1调用

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