2011-02-25 27 views
5

Hay un aspecto de los temporizadores en las conexiones asíncronas que quiero saber si entiendo correctamente.Algunas aclaraciones son necesarias para las operaciones y temporizadores asíncronos Boost asio

Supongamos que configuramos un temporizador antes de realizar una operación de lectura, que incluye un controlador, y luego, run() el io_service.

lo que tengo entendido, el io_service termina tan pronto como el gerente termina después de haber sido invocado, lo cual puede suceder por dos razones:

a) la operación de lectura se ha completado.

b) el temporizador ha alcanzado su límite.

Supongamos que se ha alcanzado la primera (a) condición y que la operación de lectura se ha completado antes de que termine el temporizador.

La pregunta es: ¿Qué le sucede a ese temporizador? ¿Necesitamos terminarlo? Diga

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

after the io_service.run()? 

¿Puede restablecerlo a un nuevo intervalo si es necesario reutilizar el mismo objeto del temporizador para otra operación de lectura?

¿Puedo restablecer() el io_service y reutilizar el mismo objeto en un nuevo run() para esa nueva operación?

Respuesta

8

The question is: What happens to that timer? Do we need to finish it.

manejador del temporizador todavía será invocada si no se cancel

void my_read_handler() { 
    dTimer_.cancel(); // remember to catch exceptions 
} 

El async_wait handler se aprobó una error code de boost::asio::error::operation_aborted si se ha cancelado correctamente. Si el async_wait se completó antes del cancel y el controlador ya había sido puesto en cola por el io_service, su controlador deberá detectar esa condición y reaccionar adecuadamente.


Can you reset it to a new interval if necessary re-use the same timer object for another read operation?

A deadline_timer puede ser reset usando expires_from_now

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the boost::asio::error::operation_aborted error code.


Can I reset() the io_service and reuse the same object in a new run() for that new operation?

El mismo io_service objeto se puede utilizar de nuevo para run() o poll() después resetting ella.

This function must be called prior to any second or later set of invocations of the run(), run_one(), poll() or poll_one() functions when a previous invocation of these functions returned due to the io_service being stopped or running out of work. This function allows the io_service to reset any internal state, such as a "stopped" flag.

+0

respuesta integral, + 1 para asio impulso :: :: :: error operation_aborted – Ralf

+0

muchas gracias por su explicación clara y nítida del proceso involucrado, pero sigue siendo una pregunta: suponiendo que mi primer escenario, si hay es una operación de lectura y un temporizador, ¿termina io_service cuando termina el primero? el primero? ¿o ambos? –

+0

@Old novato 'io_service :: run()' devuelve el control a la persona que llama cuando no hay más trabajo por hacer, esto está bien descrito en la [documentación] (http://www.boost.org/doc/libs/1_46_0 /doc/html/boost_asio/reference/io_service/run/overload1.html). En su contexto, significa que todos los manejadores pendientes, tanto 'async_read' como' async_wait', serán invocados antes de que regrese. –

Cuestiones relacionadas