一些澄清需要abous Boost asio异步操作和定时器

时间:2011-02-25 10:59:28

标签: c++ boost boost-asio

如果我理解正确,我想知道异步连接中的定时器的一个方面。

假设我们在执行读取操作之前设置了一个计时器,其中包括一个处理程序,然后run() io_service。

据我了解,io_service在调用后经理结束后立即结束,这可能有两个原因:

a)读取操作完成。

b)计时器已达到极限。

假设已达到第一个(a)条件,并且在计时器结束之前已完成读取操作。

问题是:该计时器会发生什么?我们需要完成它吗?说

dTimer_.expires_from_now (boost::posix_time::seconds(0));

after the io_service.run()?

如果需要重新使用相同的计时器对象进行另一次读取操作,是否可以将其重置为新的间隔?

我可以重置()io_service并在新的run()中为该新操作重用相同的对象吗?

1 个答案:

答案 0 :(得分:8)

  

问题是:发生了什么   计时器?我们需要完成它吗?

如果你没有cancel

,仍会调用计时器的处理程序
void my_read_handler() {
     dTimer_.cancel(); // remember to catch exceptions
}

async_wait handler如果成功取消,将boost::asio::error::operation_aborted传递error code async_wait。如果cancelio_service之前完成并且处理程序已经由expires_from_now排队,那么您的处理程序将需要检测该条件并做出适当的反应。


  

如果可以,请将其重置为新的间隔   必须重新使用相同的计时器对象   另一个读操作?

deadline_timer可以使用io_service

reset
  

此功能设定到期时间。   任何挂起的异步等待   运营将被取消。该   每个已取消操作的处理程序   将被调用   提高:: ASIO ::错误:: operation_aborted   错误代码。


  

我可以重置()io_service并重用   新的run()中的相同对象   那个新手术?

相同的run()对象可以在resetting之后再次用于poll()或{{1}}。

  

此功能必须在之前调用   任何第二组或更高版本的调用   run(),run_one(),poll()或   poll_one()在前一个函数中起作用   调用这些函数返回   由于io_service被停止或   用完了。这个功能   允许io_service重置任何   内部状态,如“停止”   标志。