Objets minuteur pouvant être attendus
Un objet de 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 pouvant ê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.
Objet | Description |
---|---|
minuteur de réinitialisation manuelle | Minuteur dont l’état reste signalé jusqu’à SetWaitableTimer est 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 réactivé chaque fois que la période spécifiée expire, 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. |
Note
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 conservent le processeur constamment occupé, ce qui empêche le système de rester dans un état d’alimentation inférieur pour une durée significative. Cela peut avoir un impact négatif sur la durée de vie de la batterie de l’ordinateur portable et les scénarios qui dépendent d’une gestion efficace de l’alimentation, comme les grands centres de données. Pour améliorer l’efficacité énergétique, envisagez d’utiliser des notifications basées sur des événements au lieu de notifications basées sur le temps dans votre application. Si un minuteur est nécessaire, utilisez un minuteur signalé une 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 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 vers un objet minuteur peut utiliser l’une des fonctions d’attente 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 établit 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. Une fois l’objet minuteur terminé, appelez CloseHandle pour fermer le handle de l’objet minuteur.
Le comportement d’un minuteur pouvant être attendu 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, il est mis en file d’attente vers le thread qui définit le minuteur. La routine d’achèvement reste dans la file d’attente appel de procédure asynchrone (APC) du thread jusqu’à ce que le thread entre dans un état d’attente alertable. À ce stade, l’APC est distribué et la routine d’achèvement est appelée. Si le minuteur est périodique, il est placé 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’il existe toujours une file d’attente d’APC sur 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é.
Rubriques connexes