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?
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
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