boost 文档有以下示例代码:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using namespace boost;
void print(const system::error_code& e, asio::steady_timer* timer, int count)
{
if (count < 5)
{
std::cout << count << std::endl;
++count;
timer->expires_at(timer->expiry() + asio::chrono::seconds(1));
timer->async_wait(boost::bind(print, asio::placeholders::error, timer, count));
}
}
int main()
{
asio::io_context io;
int count = 0;
asio::steady_timer t(io, asio::chrono::seconds(1));
t.async_wait(bind(print, asio::placeholders::error, &t, count));
io.run();
return 0;
}
这里,在 main 函数中,定时器的初始值是 5 秒:
asio::steady_timer t(io, asio::chrono::seconds(5));
这个初始值有什么用呢?我注意到,如果去掉这个参数,即这样做:
asio::steady_timer t(io);
那么计时器会立即显示从 0 到 5 的所有值,而不是每秒一次。为什么会有这种行为?为什么定时器需要有一个初始值才能每秒输出一次值?
定时器具有三种类型的构造函数:
asio::steady_timer t(io, asio::chrono::seconds(5));
属于第二类,而asio::steady_timer t(io);
第三类,但是,您没有设置响应时间,它仍然等于时钟的开始时间,因此事实证明它在创建时已经过期。通过在调用处理程序时在时钟的开头添加一秒(而不是当前时间),您还可以获得已经过期的时间点。如果你正常编写处理程序,你可以更清楚地理解发生了什么:在线编译器