如果我理解正确,我想知道异步连接中的定时器的一个方面。
假设我们在执行读取操作之前设置了一个计时器,其中包括一个处理程序,然后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()
中为该新操作重用相同的对象吗?
答案 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
。如果cancel
在io_service
之前完成并且处理程序已经由expires_from_now
排队,那么您的处理程序将需要检测该条件并做出适当的反应。
如果可以,请将其重置为新的间隔 必须重新使用相同的计时器对象 另一个读操作?
deadline_timer可以使用io_service
此功能设定到期时间。 任何挂起的异步等待 运营将被取消。该 每个已取消操作的处理程序 将被调用 提高:: ASIO ::错误:: operation_aborted 错误代码。
我可以重置()io_service并重用 新的run()中的相同对象 那个新手术?
相同的run()
对象可以在resetting之后再次用于poll()
或{{1}}。
此功能必须在之前调用 任何第二组或更高版本的调用 run(),run_one(),poll()或 poll_one()在前一个函数中起作用 调用这些函数返回 由于io_service被停止或 用完了。这个功能 允许io_service重置任何 内部状态,如“停止” 标志。