Share via


Wartebare Timerobjekte

Ein wartebares Timerobjekt ist ein Synchronisierungsobjekt, dessen Zustand auf signalisiert wird, wenn die angegebene Fälligkeit eintrifft. Es gibt zwei Arten von wartebaren Timern, die erstellt werden können: manuelles Zurücksetzen und Synchronisierung. Ein Timer beider Typen kann auch ein periodischer Timer sein.

Object BESCHREIBUNG
Timer für manuelles Zurücksetzen Ein Timer, dessen Zustand so lange signalisiert bleibt, bis SetWaitableTimer aufgerufen wird, um eine neue Fälligkeitszeit einzurichten.
Synchronisierungszeitgeber Ein Timer, dessen Zustand so lange signalisiert bleibt, bis ein Thread einen Wartevorgang für das Timerobjekt abgeschlossen hat.
periodischer Timer Ein Timer, der jedes Mal reaktiviert wird, wenn der angegebene Zeitraum abläuft, bis der Timer zurückgesetzt oder abgebrochen wird. Ein periodischer Timer ist entweder ein periodischer Timer zum manuellen Zurücksetzen oder ein periodischer Synchronisierungszeitgeber.

 

Hinweis

Wenn ein Timer signalisiert wird, muss der Prozessor ausgeführt werden, um die zugehörigen Anweisungen zu verarbeiten. Periodische Hochfrequenz-Timer halten den Prozessor ständig beschäftigt, was verhindert, dass das System für einen sinnvollen Zeitraum in einem niedrigeren Leistungszustand bleibt. Dies kann negative Auswirkungen auf die Akkulaufzeit tragbarer Computer und Szenarien haben, die von einer effektiven Energieverwaltung abhängig sind, z. B. große Rechenzentren. Für eine höhere Energieeffizienz sollten Sie ereignisbasierte Benachrichtigungen anstelle zeitbasierter Benachrichtigungen in Ihrer Anwendung verwenden. Wenn ein Timer erforderlich ist, verwenden Sie einen Timer, der einmal signalisiert wird, anstelle eines periodischen Timers, oder legen Sie das Intervall auf einen Wert von mehr als einer Sekunde fest.

 

Ein Thread verwendet die Funktion CreateWaitableTimer oder CreateWaitableTimerEx , um ein Timerobjekt zu erstellen. Der erstellende Thread gibt an, ob es sich beim Timer um einen Timer für manuelles Zurücksetzen oder um einen Synchronisierungszeitgeber handelt. Der erstellenden Thread kann einen Namen für das Timerobjekt angeben. Threads in anderen Prozessen können ein Handle für einen vorhandenen Timer öffnen, indem sie seinen Namen in einem Aufruf der OpenWaitableTimer-Funktion angeben. Jeder Thread mit einem Handle für ein Timerobjekt kann eine der Wartefunktionen verwenden, um zu warten, bis der Zeitgeberzustand auf 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 lpDueTime-Parameter , um die Uhrzeit anzugeben, zu der der Timer auf den signalierten Zustand festgelegt werden soll. Wenn ein Timer für manuelles Zurücksetzen auf den signalierten Zustand festgelegt ist, bleibt er in diesem Zustand, bis SetWaitableTimer eine neue Fälligkeitszeit festlegt. Wenn ein Synchronisierungszeitgeber auf den signalierten Zustand festgelegt ist, bleibt er in diesem Zustand, bis ein Thread einen Wartevorgang für das Timerobjekt abgeschlossen hat.
  • Verwenden Sie den lPeriod-Parameter der SetWaitableTimer-Funktion , um den Timerzeitraum anzugeben. Wenn der Zeitraum nicht 0 ist, ist der Timer ein periodischer Timer. Er wird jedes Mal wieder aktiviert, wenn der Zeitraum abläuft, bis der Timer zurückgesetzt oder abgebrochen wird. Wenn der Zeitraum 0 ist, ist der Timer kein periodischer Timer. es wird einmal signalisiert und dann deaktiviert.

Ein Thread kann die CancelWaitableTimer-Funktion verwenden, um den Timer auf den inaktiven Zustand festzulegen. Um den Timer zurückzusetzen, rufen Sie SetWaitableTimer auf. Wenn Sie mit dem Timerobjekt fertig sind, rufen Sie CloseHandle auf, um das Handle für das Timerobjekt zu schließen.

Das Verhalten eines wartebaren Timers kann wie folgt zusammengefasst werden:

  • Wenn ein Timer festgelegt ist, wird er abgebrochen, wenn er bereits aktiv war, der Zustand des Timers nicht signalisiert 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 Vervollständigungsroutine verfügt, wird er in die Warteschlange für den Thread eingereiht, der den Timer festgelegt hat. Die Vervollständigungsroutine verbleibt in der Asynchronen Prozeduraufrufwarteschlange des Threads, bis der Thread in einen warnbaren Wartezustand wechselt. Zu diesem Zeitpunkt wird der APC verteilt, und die Vervollständigungsroutine wird aufgerufen. Wenn der Timer periodisch ist, wird er wieder in der Kernel-Timer-Warteschlange platziert.
  • Wenn ein Timer abgebrochen wird, wird er aus der Kerneltimerwarteschlange entfernt, wenn er ausstehend war. Wenn der Timer abgelaufen ist und sich weiterhin eine APC-Warteschlange für den Thread befindet, der den Timer festgelegt hat, wird der APC aus der APC-Warteschlange des Threads entfernt. Der Signalzustand des Timers wird nicht beeinflusst.

Asynchrone Prozeduraufrufe

Verwenden von wartebaren Timerobjekten