2010-03-20 20 views
5

Hay una línea en el 3er tutorial sobre Boost asio que muestra cómo renovar un temporizador y evitar que se desplace. La línea es la siguiente:Necesita una explicación para este boost :: asio timer example

t->expires_at(t->expires_at() + boost::posix_time::seconds(1)); 

Tal vez soy yo pero no fue capaz de encontrar documentación sobre el segundo uso de correo xpires_at(), sin parámetros. expires_at(x) establece la nueva caducidad, cancelando cualquier manejador de finalización pendiente. Entonces, presumiblemente expires_at() hace qué, el tiempo de retorno de la última expiración? Entonces, agregando un segundo, si debe haber un número de ms, digamos n ms, entonces, en esencia, será "restado" de la próxima expiración ya que el tiempo se está contabilizando. ¿Qué sucede entonces si el tiempo que lleva realizar este controlador es mayor a 1 segundo en este ejemplo? ¿Dispara inmediatamente?

Respuesta

2

expires_at() devuelve el tiempo cuando se establece en tiempo de espera. Esto moverá el tiempo de espera a 1 segundo más tarde.

Cuando establece el tiempo con expires_at (x) obtendrá un retorno de 0 si ya se invoca debido al tiempo ya pasado. Si el retorno es más grande que 0, indica el número de cancelaciones que se realizaron.

+0

No estoy seguro de que entiendo su primera oración. expires_at() devuelve un tiempo posix (en este caso posix). pero en esta línea de código se está ejecutando * dentro de * el controlador de finalización, por lo que la expiración está en el pasado (solo sucedió hace un momento dividido). Entonces, si entiendo el efecto es que estás agregando tiempo en el pasado con 1 segundo, por lo tanto, tienes en cuenta el tiempo que estás tomando * ahora * para realizar el controlador de finalización (el código que precedió a esta línea). Así es como se evita la deriva, ¿verdad? De lo contrario, está agregando 1 segundo + el tiempo que tomó ejecutar el código que precede a esta línea? – ApplePieIsGood

+0

Esto agregará 1 segundo al momento en que se suponía que invocaría el controlador. Por lo tanto, si tiene un retraso por algún motivo antes de entrar en el controlador, es menos de un segundo antes de que vuelva a invocar al controlador. O en el caso especial, simplemente lo colocará en la cola porque ya debería haber sido procesado, porque tardó mucho en llegar a este código. Si crees que es un gran riesgo 1s es pequeño, quizás deberías usar expires_from_now (x) para establecer 1s a partir de ahora. – jpyllman

Cuestiones relacionadas