que tenían el mismo escenario exacto de una vez hizo lo siguiente:
- la estructura que guardaba en
std::priority_queue
contenían sólo el tiempo para ordenar y un índice a una std::vector<Handler>
(en mi caso Handler
era boost::function
, pero bien podría ser un puntero a la interfaz o la función)
- al agregar un temporizador, me gustaría encontrar un índice libre en el vector de controladores y almacenar el controlador en ese índice. Almacene el índice y la hora en la prioridad_cola. Devuelva el índice al cliente como token para cancelar
- para cancelar un temporizador, pase el índice recibido al agregarlo. Borre el controlador en ese índice (para
boost::function
llame al clear()
, si usa punteros, configúrelo en cero)
- cuando es hora de devolver la llamada a un temporizador, obtenga su índice de controlador de la cola de prioridad y revise el vector de controladores - si el controlador de esa posición está vacía()/NULL, el temporizador ha sido cancelado. Marque el índice del controlador como gratuito.
Para hacer la búsqueda de un índice de conexión rápida, he usado un std::stack
separada de los índices. Cuando agrega un temporizador y esa pila está vacía, agregue al final del vector; de lo contrario, haga estallar el índice superior y úselo.
Aquí es el punto cuando se pulsa el índice para los índices libres apilar
Todo esto es un poco complicado y propenso a errores, especialmente si sus rutinas de temporización que añadir o cancelar temporizadores. Here's a link to my canceling timer class described above, this code is public domain
He hecho algo similar a esto también. Es un patrón útil. –
intrigante. Pero no puedo ver cómo manejar el caso cuando un temporizador se "cancela", pero de hecho ya se ha ejecutado. ¿Dejas todo bajo el código de llamada para borrar cualquier control de un temporizador cuando ese temporizador se dispara? –
Creo que voy a hacer que mis estructuras en cola almacenen un 'boost :: shared_ptr' que funciona como un controlador para el temporizador. Entonces, cualquiera puede entrar en ese mango y establecer una bandera "cancelada", que se recogerá cuando el cronómetro esté listo. –