Waitable Timer Objects
Ein wartebares Timerobjekt ist ein Synchronisierungsobjekt, dessen Status beim Eintreffen der angegebenen Fälligkeitszeit signalisiert wird. Es gibt zwei Arten von Wartezeitgebern, die erstellt werden können: manuelles Zurücksetzen und Synchronisieren. Ein Timer eines der beiden Typen kann auch ein periodischer Timer sein.
Objekt | Beschreibung |
---|---|
Zeitgeber für manuelles Zurücksetzen | Ein Zeitgeber, dessen Zustand bis SetWaitableTimer signalisiert wird, um eine neue Fälligkeitszeit einzurichten. |
Synchronisierungszeitgeber | Ein Timer, dessen Zustand signalisiert bleibt, bis ein Thread einen Wartevorgang für das Timerobjekt abgeschlossen hat. |
periodischer Timer | Ein Timer, der jedes Mal erneut aktiviert wird, wenn der angegebene Zeitraum abläuft, bis der Timer zurückgesetzt oder abgebrochen wird. Ein periodischer Timer ist entweder ein regelmäßiger manuell zurückgesetzter Timer oder ein periodischer Synchronisierungszeitgeber. |
Anmerkung
Wenn ein Timer signalisiert wird, muss der Prozessor ausgeführt werden, um die zugehörigen Anweisungen zu verarbeiten. Periodische Zeitgeber mit hoher Frequenz halten den Prozessor ständig beschäftigt, was verhindert, dass das System in einem niedrigeren Leistungszustand für einen sinnvollen Zeitraum verbleiben kann. Dies kann sich negativ auf die Akkulaufzeit von tragbaren Computern und Szenarien auswirken, die von einer effektiven Energieverwaltung wie großen Rechenzentren abhängen. Um eine höhere Energieeffizienz zu erzielen, sollten Sie ereignisbasierte Benachrichtigungen anstelle zeitbasierter Benachrichtigungen in Ihrer Anwendung verwenden. Wenn ein Timer erforderlich ist, verwenden Sie einen Timer, der einmal anstelle eines periodischen Timers signalisiert wird, oder legen Sie das Intervall auf einen Wert fest, der größer als eine Sekunde ist.
Ein Thread verwendet die CreateWaitableTimer- oder CreateWaitableTimerEx--Funktion, um ein Timerobjekt zu erstellen. Der Erstellungsthread gibt an, ob der Timer ein manuell zurückgesetzter Timer oder ein Synchronisierungszeitgeber ist. Der Erstellungsthread kann einen Namen für das Timerobjekt angeben. Threads in anderen Prozessen können ein Handle für einen vorhandenen Timer öffnen, indem er seinen Namen in einem Aufruf der OpenWaitableTimer--Funktion angibt. Jeder Thread mit einem Handle für ein Timerobjekt kann eine der Wait-Funktionen verwenden, um auf den Zeitgeberzustand zu warten, auf das signalisiert wird.
- Der Thread ruft die SetWaitableTimer--Funktion auf, um den Timer zu aktivieren. Beachten Sie die Verwendung der folgenden Parameter für SetWaitableTimer-:
- Verwenden Sie den parameter lpDueTime, um die Uhrzeit anzugeben, zu der der Timer auf den signalfähigen Zustand festgelegt werden soll. Wenn ein manuell zurückgesetzter Timer auf den signalgesteuerten Zustand festgelegt ist, bleibt er in diesem Zustand, bis SetWaitableTimer eine neue Fälligkeitszeit einrichtet. Wenn ein Synchronisierungszeitgeber auf den signalisierten Zustand festgelegt ist, verbleibt er in diesem Zustand, bis ein Thread einen Wartezeitvorgang für das Timerobjekt abgeschlossen hat.
- Verwenden Sie den lPeriod Parameter der SetWaitableTimer--Funktion, um den Zeitgeberzeitraum anzugeben. Wenn der Zeitraum nicht null ist, ist der Timer ein periodischer Timer; sie wird jedes Mal erneut aktiviert, wenn der Zeitraum abläuft, bis der Timer zurückgesetzt oder abgebrochen wird. Wenn der Zeitraum null ist, ist der Timer kein periodischer Timer; sie wird einmal signalisiert und dann deaktiviert.
Ein Thread kann die CancelWaitableTimer--Funktion verwenden, um den Timer auf den inaktiven Zustand festzulegen. Rufen Sie zum Zurücksetzen des Timers SetWaitableTimer-auf. Wenn Sie mit dem Timerobjekt fertig sind, rufen Sie CloseHandle- auf, um das Handle mit dem Timerobjekt zu schließen.
Das Verhalten eines Wartezeitgebers kann wie folgt zusammengefasst werden:
- Wenn ein Timer festgelegt ist, wird er abgebrochen, wenn er bereits aktiv war, der Zustand des Timers nicht signaliert ist und der Timer in der Kerneltimerwarteschlange platziert wird.
- Wenn ein Timer abläuft, wird der Timer auf den signalierten Zustand festgelegt. Wenn der Timer über eine Abschlussroutine verfügt, wird er in die Warteschlange für den Thread eingereiht, der den Timer festgelegt hat. Die Abschlussroutine verbleibt im asynchronen Prozeduraufrufs (APC)-Warteschlange des Threads, bis der Thread in einen warnbaren Wartezustand wechselt. Zu diesem Zeitpunkt wird der APC verteilt und die Abschlussroutine aufgerufen. Wenn der Timer periodisch ist, wird er wieder in der Kerneltimerwarteschlange platziert.
- Wenn ein Timer abgebrochen wird, wird er aus der Kerneltimerwarteschlange entfernt, wenn er aussteht. Wenn der Timer abgelaufen war und noch ein APC-Warteschlange für den Thread vorhanden ist, der den Timer festgelegt hat, wird der APC aus der APC-Warteschlange des Threads entfernt. Der signalisierte Zustand des Timers ist nicht betroffen.
Verwandte Themen
-
Verwenden von mit wartenden Timerobjekten