2011-01-04 12 views

Respuesta

7

El controlador para el tiempo de espera será llamada con una condición de error si el temporizador fue cancelada (así como un tiempo de espera normal). Entonces, ¿no podría simplemente configurar un bool antes de llamar al async_wait y luego reiniciarlo en el controlador si se establece la condición de error?

+0

sí, se acaba de comprobar si no me he perdido algo en la interfaz deadline_timer –

2

tres opciones vienen a la mente:

  1. crear su propia clase temporizador (mediante el uso de la deadline_timer por supuesto) que tiene su propio miembro do_async_wait. En este miembro, establece una variable miembro que luego puede ser devuelta por un miembro bool isWaiting() o similar, antes de llamar a async_wait en el deadline_timer interno. Tenga en cuenta que no creo que el miembro async_wait sea virtual, por lo que no puede heredar desde deadline_timer y anular. Tenga en cuenta que también necesitaría reiniciar el indicador cuando se llame a su controlador (haciendo que su propio temporizador sea el controlador que luego reenvía a cualquier otro controlador) o cuando se llame a cancelar.

  2. Edita el código de refuerzo para hacer lo que quieras. Esto es perfectamente legal por lo que yo sé, sin embargo, esta no es una muy buena opción.

  3. Modifique sus requisitos/diseño para que no necesite saber esto.

2

¿Qué tal esto?

boost::asio::deadline_timer mTimer; 
const bool timerExpired = (mTimer.expires_at() 
    <= boost::posix_time::second_clock::local_time()); 
+0

Esto no funcionará debido a que el temporizador no se garantiza que expira exactamente a tiempo. –

+0

¿Cómo es eso diferente a cualquier otro temporizador? –

+0

No es "diferente a ningún otro temporizador". Pero si usa este código para detectar si el temporizador está activo, hay una condición de carrera en la que esto volverá verdadero durante un pequeño intervalo antes de que el temporizador haya expirado. Si usa esto, por ejemplo, para verificar si es seguro liberar memoria, su programa se bloqueará. –

0

sé que esto es un poco viejo en este punto, pero no tengo otra posible sugerencia: ¿Qué le parece la aplicación y luego solicitar si hay posiblemente pendientes de espera. Se vería así:

mTimer.get_implementation().might_have_pending_waits 
Cuestiones relacionadas