
Aufgrund eines aktuellen Anwendungsfalles habe ich eine Timerklasse in C# entwickelt, die sehr flexibel ist. Hinzu kam noch die Tatsache, das Timer eins dieser nicht endenden Probleme ist, die in jedem Projekt neu gelöst werden.
Es handelt sich dabei um einen frei einstellbaren Timer, der auf einem Hintergrundthread und den Funktionen QueryPerformanceCounter und QueryPerformanceFrequency basiert. Er hat eine Reihe von Eigenschaften:
Mit Interval und TimeWindow wird vorgegeben, wann der Timer auslösen soll. Interval gibt das Zeitintervall zwischen zwei Ereignissen vor, mit dem TimeWindow kann ein Bereich um das Zielinterval herum definiert werden, in dem der Timer auslösen darf. Der Modus gibt an, wie sich der Timer verhalten soll, wenn er nicht innerhalb des Zeitramens (Interval-TimeWindow bis Interval+TimeWindow) auslösen kann. Bei ReduceSleep wird die Pausenzeit reduziert in der Hoffnung, dadurch das Zeitfenster noch zu erreichen. FireBefore lässt den Timer vor dem Zeitfenster auslösen, FireAfter das Zeitfenster verstreichen.
Über SleepTime und die SleepMethod kann die Genauigkeit und CPU-Last des Timers eingestellt werden. Steht SleepMethod auf Sleep, so legt sich der Thread des Timers schlafen. Dadurch steigt jedoch seine Latenz. Bei Tests lag die Latenz des Timers bei 15 ms, es ist also recht grob auflösend. Für feiner auflösende Timer empfielt sich SpinWait. Das belastet die CPU und sorgt dafür, das der Timer nahezu perfekt (der jitter liegt bei 0,00X ms) auslöst. Im Projekt ist ein kleines Beispielprogramm enthalten.
Das Projekt ist zwar mit den 2008er Entwicklertools erstellt, man kann die Quellen jedoch auch in ein 2005er Projekt importieren und damit übersetzen, es werden keine neuen Features verwendet.