Informationen über Timer
In diesem Thema wird beschrieben, wie Timer erstellt, identifiziert, festgelegt und gelöscht werden. Eine Anwendung verwendet einen Timer, um ein Ereignis für ein Fenster zu planen, nachdem eine angegebene Zeit verstrichen ist. Jedes Mal, wenn das angegebene Intervall (oder der Timeout-Wert) für einen Timer abläuft, benachrichtigt das System das mit dem Timer verbundene Fenster. Da die Genauigkeit eines Timers von der Systemtaktrate abhängt und davon, wie oft die Anwendung Nachrichten aus der Nachrichtenwarteschlange abruft, ist der Timeout-Wert nur ein Näherungswert.
Das Thema enthält folgende Abschnitte:
Timervorgänge
Anwendungen erstellen Timer mithilfe der Funktion SetTimer. Ein neuer Timer startet die Anzeigedauer des Intervalls, sobald er erstellt wird. Eine Anwendung kann den Timeoutwert eines Timers mithilfe von SetTimer ändern und einen Timer mithilfe der Funktion KillTimer zerstören. Um Systemressourcen effizient zu nutzen, sollten Anwendungen Timer zerstören, die nicht mehr benötigt werden.
Jeder Timer verfügt über einen eindeutigen Bezeichner. Beim Erstellen eines Timers kann eine Anwendung entweder einen Bezeichner angeben oder das System einen eindeutigen Wert erstellen lassen. Der erste Parameter einer WM_TIMER- Nachricht enthält den Bezeichner des Timers, der die Nachricht gepostet hat.
Wenn Sie im Aufruf von SetTimer ein Fensterhandle angeben, ordnet die Anwendung den Timer diesem Fenster zu. Wenn der Timeoutwert für den Timer verstrichen ist, sendet das System eine WM_TIMER-Nachricht an das Fenster, das dem Timer zugeordnet ist. Wenn im Aufruf von SetTimer kein Fensterhandle angegeben ist, muss die Anwendung, die den Timer erstellt hat, seine Nachrichtenwarteschlange auf WM_TIMER-Nachrichten überwachen und an das entsprechende Fenster verteilen.
Hinweis
Wenn Sie die optionale TIMERPROC-Rückruffunktion angeben, wird die Funktion während derNachrichtenschleife aufgerufen und WM_TIMER wird nicht an den WNDPROC-Rückruf verteilt.
Wenn Sie benachrichtigt werden müssen, wenn ein Timer verstrichen ist, verwenden Sie einen Wartetimer. Weitere Informationen finden Sie unter Wartetimerobjekte.
Hochauflösender Timer
Ein Zähler ist ein allgemeiner Begriff, der bei der Programmierung verwendet wird, um auf eine inkrementierende Variable zu verweisen. Einige Systeme enthalten einen hochauflösenden Leistungsindikator, der verstrichene Zeiten mit hoher Auflösung bereitstellt.
Wenn auf dem System ein Leistungsindikator mit hoher Auflösung vorhanden ist, können Sie die Funktion QueryPerformanceFrequency verwenden, um die Häufigkeit in Anzahlen pro Sekunde auszudrücken. Der Wert der Anzahl ist prozessorabhängig. Bei einigen Prozessoren kann die Anzahl beispielsweise die Zyklusrate der Prozessoruhr sein.
Die Funktion QueryPerformanceCounter ruft den aktuellen Wert des Leistungsindikators mit hoher Auflösung ab. Durch Aufrufen dieser Funktion am Anfang und Ende eines Codeabschnitts verwendet eine Anwendung im Wesentlichen den Zähler als hochauflösenden Timer. Angenommen QueryPerformanceFrequency gibt an, dass die Häufigkeit des Leistungsindikators mit hoher Auflösung 50.000 Pro Sekunde beträgt. Wenn die Anwendung QueryPerformanceCounter unmittelbar vor und unmittelbar nach dem zu messenden Codeabschnitt aufruft, könnten die Zählerwerte 1500 bzw. 3500 Zähler betragen. Diese Werte deuten darauf hin, dass 0,04 Sekunden (2000 Zähler) verstrichen sind, während der Code ausgeführt wird.
Wartetimerobjekte
Ein Wartetimerobjekt ist ein Synchronisationsobjekt, dessen Zustand auf signalisiert gesetzt wird, wenn die angegebene Fälligkeitszeit eintrifft. Es gibt zwei Arten von Wartetimern, die erstellt werden können: manuelles Zurücksetzen und Synchronisieren. Ein Timer eines der beiden Typen kann auch ein periodischer Timer sein.
Ein Thread verwendet die Funktion CreateWaitableTimer oder CreateWaitableTimerEx, um ein Timerobjekt zu erstellen. Der Erstellungsthread gibt an, ob der Timer ein manuell zurückgesetzter Timer oder ein Synchronisierungstimer 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 Funktion OpenWaitableTimer angibt. Jeder Thread mit einem Ziehpunkt für ein Timerobjekt kann eine der Wartefunktionen verwenden, um zu warten, bis der Timerzustand auf das Signal festgelegt ist.
Weitere Informationen zum Verwenden von Wartetimerobjekten für die Threadsynchronisierung finden Sie unter Wartetimerobjekte.