本教程程序演示了如何通过修改 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));
接下来,与 Timer.1 教程中的阻塞等待不同,我们调用 steady_timer::async_wait() 函数来执行异步等待。在调用此函数时,我们传递上面定义的 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; }
查看完整源代码
返回教程索引