官网教程:https://think-async.com/Asio/asio-1.26.0/doc/asio/tutorial/tuttimer2.html
asio的异步定时器功能
#include <iostream>
#include <asio.hpp>
使用asio的异步功能意味着提供一个完成令牌,该令牌决定异步操作完成时如何将结果传递给完成处理程序。在这个程序中,我们定义了一个名为print的函数,当异步等待结束时调用它。
void print(const asio::error_code& /*e*/)
{
std::cout << "Hello, world!" << std::endl;
}
int main()
{
asio::io_context io;
asio::steady_timer t(io, asio::chrono::seconds(5));
接下来,我们不再像教程Timer.1中那样进行阻塞等待,而是调用steady_Timer::async_wait()函数来执行异步等待。当调用这个函数时,我们传递上面定义的打印函数。
t.async_wait(&print);
最后,我们必须在io_context对象上调用io_context::run()成员函数。
asio库保证只从当前调用io_context::run()的线程调用完成处理程序。因此,除非调用io_context::run()函数,否则将永远不会调用异步等待完成的完成处理程序。
io_context::run()函数也将在还有“工作”要做的时候继续运行。在本例中,工作是对计时器的异步等待,因此在计时器到期并且返回完成处理程序之前,调用不会返回。
在调用io_context::run()之前,请记住给io_context一些工作要做。例如,如果我们省略了上面对steady_timer::async_wait()的调用,那么io_context将没有任何工作要做,因此io_context::run()将立即返回。
io.run();
return 0;
}
#include <iostream>
#include <asio.hpp>
void print(const asio::error_code& /*e*/)
{
std::cout << "Hello, world!" << std::endl;
}
int main()
{
asio::io_context io;
asio::steady_timer t(io, asio::chrono::seconds(5));
t.async_wait(&print);
io.run();
return 0;
}