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

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()新操作中重用相同的对象吗?

Sam*_*ler 8

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

如果你没有计时器的处理程序将仍然被调用取消

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重置任何内部状态,例如"已停止"标志.