Objetos de temporizador que se pueden esperar
Un objeto de temporizador de espera es un objeto de sincronización cuyo estado se establece en señalado cuando llega el tiempo de vencimiento especificado. Hay dos tipos de temporizadores de espera que se pueden crear: restablecimiento manual y sincronización. Un temporizador de cualquier tipo también puede ser un temporizador periódico.
Objeto | Descripción |
---|---|
temporizador de restablecimiento manual | Temporizador cuyo estado permanece señalado hasta que se llama a setWaitableTimer para establecer un nuevo tiempo de vencimiento. |
temporizador de sincronización | Temporizador cuyo estado permanece señalado hasta que un subproceso completa una operación de espera en el objeto del temporizador. |
temporizador periódico | Temporizador que se reactiva cada vez que expira el período especificado, hasta que se restablece o cancela el temporizador. Un temporizador periódico es un temporizador de restablecimiento manual periódico o un temporizador de sincronización periódico. |
Nota
Cuando se señala un temporizador, el procesador debe ejecutarse para procesar las instrucciones asociadas. Los temporizadores periódicos de alta frecuencia mantienen el procesador ocupado continuamente, lo que impide que el sistema permanezca en un estado de energía de inferior durante cualquier cantidad de tiempo significativa. Esto puede tener un impacto negativo en la duración de la batería del equipo portátil y escenarios que dependen de la administración eficaz de energía, como centros de datos grandes. Para obtener una mayor eficiencia energética, considere la posibilidad de usar notificaciones basadas en eventos en lugar de notificaciones basadas en el tiempo en la aplicación. Si es necesario un temporizador, use un temporizador que se señale una vez en lugar de un temporizador periódico o establezca el intervalo en un valor mayor de un segundo.
Un subproceso usa el CreateWaitableTimer o función createWaitableTimerEx para crear un objeto de temporizador. El subproceso de creación especifica si el temporizador es un temporizador de restablecimiento manual o un temporizador de sincronización. El subproceso de creación puede especificar un nombre para el objeto de temporizador. Los subprocesos de otros procesos pueden abrir un identificador en un temporizador existente especificando su nombre en una llamada a la funciónopenWaitableTimer. Cualquier subproceso con un identificador para un objeto de temporizador puede usar una de las funciones de espera de esperar a que el estado del temporizador se establezca en señalizado.
- El subproceso llama a la funciónSetWaitableTimer para activar el temporizador. Tenga en cuenta el uso de los parámetros siguientes para SetWaitableTimer:
- Use el parámetro lpDueTime para especificar la hora en la que se va a establecer el temporizador en el estado señalado. Cuando se establece un temporizador de restablecimiento manual en el estado señalado, permanece en este estado hasta que SetWaitableTimer establece un nuevo tiempo de vencimiento. Cuando se establece un temporizador de sincronización en el estado señalado, permanece en este estado hasta que un subproceso completa una operación de espera en el objeto de temporizador.
- Use el parámetro lPeriod de la funciónsetWaitableTimerpara especificar el período del temporizador. Si el período no es cero, el temporizador es un temporizador periódico; se reactiva cada vez que expira el período, hasta que se restablece o cancela el temporizador. Si el período es cero, el temporizador no es un temporizador periódico; se señala una vez y luego se desactiva.
Un subproceso puede usar la función CancelWaitableTimer para establecer el temporizador en el estado inactivo. Para restablecer el temporizador, llame a SetWaitableTimer. Cuando haya terminado con el objeto de temporizador, llame a CloseHandle para cerrar el identificador del objeto de temporizador.
El comportamiento de un temporizador de espera se puede resumir de la siguiente manera:
- Cuando se establece un temporizador, se cancela si ya estaba activo, el estado del temporizador no está asignado y el temporizador se coloca en la cola del temporizador del kernel.
- Cuando expira un temporizador, el temporizador se establece en el estado señalado. Si el temporizador tiene una rutina de finalización, se pone en cola en el subproceso que establece el temporizador. La rutina de finalización permanece en la cola de llamada de procedimiento asincrónico (APC) del subproceso hasta que el subproceso entra en un estado de espera alertable. En ese momento, se envía el APC y se llama a la rutina de finalización. Si el temporizador es periódico, se vuelve a colocar en la cola del temporizador del kernel.
- Cuando se cancela un temporizador, se quita de la cola del temporizador del kernel si estaba pendiente. Si el temporizador había expirado y todavía hay un APC en cola en el subproceso que estableció el temporizador, el APC se quita de la cola de APC del subproceso. El estado señalado del temporizador no se ve afectado.
Temas relacionados