Cuando llama al expires_from_now()
en un temporizador en ejecución, , se cancela el temporizador y se invoca un nuevo temporizador. Entonces se llama al controlador asociado. Es fácil discriminar en el controlador entre un temporizador cancelado y otro vencido. Sin embargo, me pregunto si existe una forma de discriminar entre un temporizador caducado y un temporizador reactivado. En ambos casos, el controlador se llama con error_code operation_aborted
. O tal vez me faltan algunos detalles.Cómo discrimina un impulso cancelado de un impulso reactivado deadline_timer
El código siguiente genera el siguiente resultado:
20120415 21:32:28079507 Main: Timer1 set to 15 s.
20120415 21:32:28079798 Main: Timer1 set to 12 s.
20120415 21:32:28079916 Handler1: Timer 1 was cancelled or retriggered.
20120415 21:32:40079860 Handler1: expired.
Esto sugiere que el controlador no es capaz de poner en práctica acciones para un manejador cancelado, debido a retriggering un temporizador llamará el mismo controlador y con ello ejecutar el mismo comportamiento. Lo cual probablemente no sea el comportamiento previsto.
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <iostream>
using namespace boost::posix_time;
using namespace std;
void handler1(const boost::system::error_code &ec)
{
if (ec == boost::asio::error::operation_aborted)
{
cout << microsec_clock::local_time() << " Handler1: Timer was cancelled or retriggered." << endl;
}
else
{
cout << microsec_clock::local_time() << " Handler1: Timer expired." << endl;
}
}
boost::asio::io_service io_service1;
void run1()
{
io_service1.run();
}
int main()
{
time_facet *facet = new time_facet("%Y%m%d %H:%M:%S%f");
cout.imbue(locale(cout.getloc(), facet));
boost::asio::deadline_timer timer1(io_service1, seconds(15));
timer1.async_wait(handler1);
cout << microsec_clock::local_time() << " Main: Timer1 set to 15 s." << endl;
// now actually run the timer
boost::thread thread1(run1);
timer1.expires_from_now(seconds(12));
cout << microsec_clock::local_time() << " Main: Timer1 set to 12 s." << endl;
// here the timer is running, but we need to reset the deadline
timer1.async_wait(handler1);
thread1.join(); // wait for thread1 to terminate
}
Por favor, dinos qué quieres lograr. ¿Cuál es la imagen más grande? –
Estoy tratando de implementar algún retraso de activación desencadenado por eventos. Puedo implementar un retardo básico de encendido sin volver a dispararlo. Pero si acepta retrasos temporales variables o cambiantes, tendré que volver a dispararlo. –
¿Y por qué no hacer nada, cuando se ejecuta operation_aborted, recuerde un controlador determinado y configúrelo de nuevo? –