Objets du minuteur d’attente

Un objet minuteur d’attente est un objet de synchronisation dont l’état est défini sur signalé lorsque l’heure d’échéance spécifiée arrive. Il existe deux types de minuteurs d’attente qui peuvent être créés : la réinitialisation manuelle et la synchronisation. Un minuteur de l’un ou l’autre type peut également être un minuteur périodique.

Object Description
minuteur de réinitialisation manuelle Minuteur dont l’état reste signalé jusqu’à ce que SetWaitableTimer soit appelé pour établir un nouveau délai d’échéance.
minuteur de synchronisation Minuteur dont l’état reste signalé jusqu’à ce qu’un thread termine une opération d’attente sur l’objet minuteur.
minuteur périodique Minuteur qui est réactivé à chaque expiration de la période spécifiée, jusqu’à ce que le minuteur soit réinitialisé ou annulé. Un minuteur périodique est un minuteur de réinitialisation manuelle périodique ou un minuteur de synchronisation périodique.

 

Notes

Lorsqu’un minuteur est signalé, le processeur doit s’exécuter pour traiter les instructions associées. Les minuteurs périodiques à fréquence élevée maintiennent le processeur continuellement occupé, ce qui empêche le système de rester dans un état de puissance inférieure pendant une durée significative. Cela peut avoir un impact négatif sur l’autonomie de la batterie des ordinateurs portables et les scénarios qui dépendent d’une gestion efficace de l’alimentation, comme les grands centres de données. Pour une plus grande efficacité énergétique, envisagez d’utiliser des notifications basées sur les événements plutôt que des notifications basées sur le temps dans votre application. Si un minuteur est nécessaire, utilisez un minuteur signalé une seule fois plutôt qu’un minuteur périodique, ou définissez l’intervalle sur une valeur supérieure à une seconde.

 

Un thread utilise la fonction CreateWaitableTimer ou CreateWaitableTimerEx pour créer un objet de minuteur. Le thread de création spécifie si le minuteur est un minuteur de réinitialisation manuelle ou un minuteur de synchronisation. Le thread de création peut spécifier un nom pour l’objet minuteur. Les threads d’autres processus peuvent ouvrir un handle à un minuteur existant en spécifiant son nom dans un appel à la fonction OpenWaitableTimer . Tout thread avec un handle pour un objet de minuteur peut utiliser l’une des fonctions d’attente pour attendre que l’état du minuteur soit défini sur signalé.

  • Le thread appelle la fonction SetWaitableTimer pour activer le minuteur. Notez l’utilisation des paramètres suivants pour SetWaitableTimer :
  • Utilisez le paramètre lpDueTime pour spécifier l’heure à laquelle le minuteur doit être défini sur l’état signalé. Lorsqu’un minuteur de réinitialisation manuelle est défini sur l’état signalé, il reste dans cet état jusqu’à ce que SetWaitableTimer établisse un nouveau délai d’échéance. Lorsqu’un minuteur de synchronisation est défini sur l’état signalé, il reste dans cet état jusqu’à ce qu’un thread termine une opération d’attente sur l’objet minuteur.
  • Utilisez le paramètre lPeriod de la fonction SetWaitableTimer pour spécifier la période du minuteur. Si la période n’est pas égale à zéro, le minuteur est un minuteur périodique ; il est réactivé chaque fois que la période expire, jusqu’à ce que le minuteur soit réinitialisé ou annulé. Si la période est égale à zéro, le minuteur n’est pas un minuteur périodique ; il est signalé une fois, puis désactivé.

Un thread peut utiliser la fonction CancelWaitableTimer pour définir le minuteur à l’état inactif. Pour réinitialiser le minuteur, appelez SetWaitableTimer. Lorsque vous avez terminé avec l’objet minuteur, appelez CloseHandle pour fermer le handle à l’objet minuteur.

Le comportement d’un minuteur d’attente peut être résumé comme suit :

  • Lorsqu’un minuteur est défini, il est annulé s’il était déjà actif, l’état du minuteur n’est pas signé et le minuteur est placé dans la file d’attente du minuteur du noyau.
  • Lorsqu’un minuteur expire, le minuteur est défini sur l’état signalé. Si le minuteur a une routine d’achèvement, elle est mise en file d’attente vers le thread qui définit le minuteur. La routine d’achèvement reste dans la file d’attente d’appel de procédure asynchrone (APC) du thread jusqu’à ce que le thread passe à un état d’attente pouvant être alerté. À ce moment-là, l’APC est envoyé et la routine d’achèvement est appelée. Si le minuteur est périodique, il est replacé dans la file d’attente du minuteur du noyau.
  • Lorsqu’un minuteur est annulé, il est supprimé de la file d’attente du minuteur du noyau s’il était en attente. Si le minuteur a expiré et qu’un APC est toujours mis en file d’attente pour le thread qui définit le minuteur, l’APC est supprimé de la file d’attente APC du thread. L’état signalé du minuteur n’est pas affecté.

Appels de procédure asynchrone

Utilisation d’objets du minuteur d’attente