Compartir a través de


Objetos de temporizador que se pueden esperar

Un objeto de temporizador que puede esperar 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 que se pueden crear: restablecimiento manual y sincronización. Un temporizador de cualquier tipo también puede ser un temporizador periódico.

Object Descripción
temporizador de restablecimiento manual Un temporizador cuyo estado permanece señalado hasta que se llama a SetWaitableTimer para establecer un nuevo tiempo de vencimiento.
temporizador de sincronización Un temporizador cuyo estado permanece señalado hasta que un subproceso completa una operación de espera en el objeto de temporizador.
temporizador periódico Un temporizador que se reactiva cada vez que expira el período especificado, hasta que el temporizador se restablezca o cancele. 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 potencia inferior durante cualquier cantidad significativa de tiempo. 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 mejorar la 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 la función CreateWaitableTimer o 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ón OpenWaitableTimer . Cualquier subproceso con un identificador para un objeto de temporizador puede usar una de las funciones de espera para esperar a que el estado del temporizador se establezca en señalizado.

  • El subproceso llama a la función SetWaitableTimer 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 un temporizador de restablecimiento manual se establece en el estado señalado, permanece en este estado hasta que SetWaitableTimer establece un nuevo tiempo de vencimiento. Cuando un temporizador de sincronización se establece 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ón SetWaitableTimer para 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 restablezca o cancele el temporizador. Si el período es cero, el temporizador no es un temporizador periódico; se señala una vez y, a continuación, 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 del temporizador.

El comportamiento de un temporizador esperable 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 a 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.

Llamadas a procedimientos asincrónicos

Uso de objetos de temporizador que se pueden esperar