Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

Timer.2 - 异步使用定时器

本教程程序演示了如何通过修改 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;
}

查看完整源代码

返回教程索引

上一篇:Timer.1 - 同步使用定时器

下一篇:Timer.3 - 将参数绑定到完成处理程序


PrevUpHomeNext