Boost C++ 库

这是世界上最受推崇、设计最精妙的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ Coding Standards

Timer.2 - 异步使用定时器 - Boost C++ 函数库
PrevUpHomeNext

本教程程序通过修改教程 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;
}

请参阅 完整的源代码列表

返回 教程索引

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

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


PrevUpHomeNext