Wartebare Timerobjekte

Ein wartebares Timerobjekt ist ein Synchronisierungsobjekt, dessen Status auf signalisiert festgelegt ist, wenn die angegebene Fälligkeit eingeht. Es gibt zwei Arten von wartenden Timern, die erstellt werden können: manuelles Zurücksetzen und Synchronisierung. Ein Timer eines der beiden Typen kann auch ein periodischer Timer sein.

Object BESCHREIBUNG
Timer für manuelles Zurücksetzen Ein Timer, dessen Zustand signalisiert bleibt, bis SetWaitableTimer aufgerufen wird, um eine neue Fälligkeitszeit festzulegen.
Synchronisierungszeitgeber Ein Timer, dessen Zustand signalisiert bleibt, bis ein Thread einen Wartevorgang für das Timerobjekt abschließt.
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 Zeitgeber für manuelles Zurücksetzen oder ein periodischer Synchronisierungszeitgeber.

Hinweis

Wenn ein Timer signalisiert wird, muss der Prozessor ausgeführt werden, um die zugeordneten Anweisungen zu verarbeiten. Regelmäßige Zeitgeber mit hoher Frequenz halten den Prozessor kontinuierlich ausgelastet, wodurch verhindert wird, dass das System für einen sinnvollen Zeitraum in einem niedrigeren Energiezustand verbleibt. Dies kann negative Auswirkungen auf die Akkulebensdauer portabler Computer und Szenarien haben, die von einer effektiven Energieverwaltung abhängen, z. B. große Rechenzentren. Um eine höhere Energieeffizienz zu erzielen, sollten Sie in Erwägung ziehen, ereignisbasierte Benachrichtigungen anstelle von zeitbasierten Benachrichtigungen in Ihrer Anwendung zu verwenden. Wenn ein Timer erforderlich ist, verwenden Sie einen Timer, der einmal signalisiert wird, anstatt einen periodischen Timer, oder legen Sie das Intervall auf einen Wert größer als eine Sekunde fest.

Ein Thread verwendet die Funktion CreateWaitableTimer oder CreateWaitableTimerEx, um ein Timerobjekt zu erstellen. Der erstellende Thread gibt an, ob der Timer ein Timer mit manueller Zurücksetzung oder ein Synchronisierungszeitgeber ist. Der erstellende 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 Timerzustand auf signalisiert festgelegt ist.

  • 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 den Zeitpunkt anzugeben, zu dem der Timer auf den signalisierten Zustand festgelegt werden soll. Wenn ein Timer für manuelles Zurücksetzen auf den signalisierten Zustand festgelegt ist, verbleibt er in diesem Zustand, bis SetWaitableTimer eine neue fälligkeitsbasierte Zeit festlegt. Wenn ein Synchronisierungszeitgeber auf den signalisierten Zustand festgelegt ist, verbleibt er in diesem Zustand, bis ein Thread einen Wartevorgang für das Timerobjekt abschließt.
  • Verwenden Sie den lPeriod-Parameter der SetWaitableTimer-Funktion, um den Timerzeitraum anzugeben. Wenn der Zeitraum nicht 0 (null) ist, ist der Timer ein periodischer Timer. sie wird jedes Mal reaktiviert, wenn der Zeitraum abläuft, bis der Timer zurückgesetzt oder abgebrochen wird. Wenn der Zeitraum 0 (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. 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 signalisierten Zustand festgelegt. Wenn der Timer über eine Abschlussroutine verfügt, wird er in die Warteschlange des Threads eingereiht, der den Timer festgelegt hat. Die Abschlussroutine verbleibt in der APC-Warteschlange (Asynchronous Procedure Call) des Threads, bis der Thread in einen warnungsfähigen Wartezustand wechselt. Zu diesem Zeitpunkt wird der APC gesendet, und die Abschlussroutine wird 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 sich immer noch ein APC in der Warteschlange des Threads befindet, der den Timer festgelegt hat, wird der APC aus der APC-Warteschlange des Threads entfernt. Der signalisierte Zustand des Timers ist nicht betroffen.

Asynchrone Prozeduraufrufe

Verwenden von wartebaren Timerobjekten