本教程程序通过修改教程 Timer.1 中的程序,演示了如何使用 asio 的异步功能,对定时器执行异步等待。
#include <iostream> #include <boost/asio.hpp>
使用 asio 的异步功能意味着提供一个 完成令牌,该令牌决定了当 异步操作 完成时,结果将如何传递给 完成处理程序。在本程序中,我们定义了一个名为 print
的函数,在异步等待完成后调用。
void print(const boost::system::error_code& /*e*/) { std::cout << "Hello, world!" << std::endl; } int main() { boost::asio::io_context io; boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
接下来,我们调用 steady_timer::async_wait() 函数执行异步等待,而不是像教程 Timer.1 中那样执行阻塞等待。调用此函数时,我们传递了上面定义的 print
函数。
t.async_wait(&print);
最后,我们必须在 io_context 对象上调用 boost::asio::io_context::run() 成员函数。
asio 库保证完成处理程序只会从当前调用 boost::asio::io_context::run() 的线程中调用。因此,除非调用 boost::asio::io_context::run() 函数,否则异步等待完成的处理程序将永远不会被调用。
boost::asio::io_context::run() 函数在仍有“工作”要做时也会继续运行。在此示例中,工作是定时器的异步等待,因此在定时器过期且完成处理程序返回之前,该调用不会返回。
在调用 boost::asio::io_context::run() 之前,务必记住让 io_context 有一些工作要做。例如,如果我们省略了上面对 steady_timer::async_wait() 的调用,io_context 将没有任何工作要做,因此 boost::asio::io_context::run() 会立即返回。
io.run(); return 0; }
请参阅 完整的源代码列表
返回 教程索引