Old*_*bie 5 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()?
Run Code Online (Sandbox Code Playgroud)
如果有必要可以将相同的计时器对象重新用于另一个读操作,是否可以将其重置为新的时间间隔?
我可以重置()io_service并在run()新操作中重用相同的对象吗?
问题是:该计时器会发生什么?我们需要完成它吗?
如果你没有计时器的处理程序将仍然被调用取消它
void my_read_handler() {
dTimer_.cancel(); // remember to catch exceptions
}
Run Code Online (Sandbox Code Playgroud)
该async_wait handler会传递一个错误代码的boost::asio::error::operation_aborted,如果它成功地取消了.如果async_wait之前已完成cancel和处理程序已经由排队io_service,你的处理器将需要检测条件和作出适当的反应.
如果有必要可以将相同的计时器对象重新用于另一个读操作,是否可以将其重置为新的时间间隔?
甲deadline_timer可以重置使用expires_from_now
此功能设置到期时间.任何挂起的异步等待操作都将被取消.将使用boost :: asio :: error :: operation_aborted错误代码调用每个已取消操作的处理程序.
我可以重置()io_service并在新的run()中为该新操作重用相同的对象吗?
同样的io_service对象可以再次使用run()或poll()后重置它.
当由于io_service被停止或用完而导致先前调用这些函数时,必须在run(),run_one(),poll()或poll_one()函数的任何第二次或更高版本的调用之前调用此函数.工作.此函数允许io_service重置任何内部状态,例如"已停止"标志.