3 Stimmen

Genaue Windows-Zeitschaltuhr? System.Timers.Timer() ist auf 15 msec begrenzt

Ich benötige einen präzisen Zeitgeber, um eine Windows-Anwendung mit einem Laborgerät zu verbinden.

Ich habe System.Timers.Timer() verwendet, um einen Timer zu erstellen, der alle 10 ms tickt, aber diese Uhr läuft langsam. Zum Beispiel sollten 1000 Ticks mit einem Intervall von 10 msec 10 Wallclock-Sekunden dauern, aber es dauert tatsächlich eher 20 Wallclock-Sekunden (auf meinem PC). Ich vermute, das liegt daran, dass System.Timers.Timer() ein Intervall-Timer ist, der jedes Mal zurückgesetzt wird, wenn er abläuft. Da es immer einige Zeit dauert, bis der Timer abgelaufen ist und zurückgesetzt wird (auf weitere 10msec), läuft die Uhr langsam. Das ist wahrscheinlich in Ordnung, wenn das Intervall groß ist (Sekunden oder Minuten), aber inakzeptabel für sehr kurze Intervalle.

Gibt es unter Windows eine Funktion, die jedes Mal eine Prozedur auslöst, wenn die Systemuhr eine Grenze von 10 msec (oder was auch immer) überschreitet?

Dies ist eine einfache Konsolenanwendung.

Danke

Norm

UPDATE: System.Timers.Timer() ist bei kleinen Intervallen extrem ungenau.

Ich habe ein einfaches Programm geschrieben, das 10 Sekunden auf verschiedene Arten zählt:

Intervall=1, Anzahl=10000, Laufzeit = 160 sec, msec pro Intervall=16

Intervall=10, Anzahl=1000, Laufzeit = 16 sec, msec pro Intervall=15

Intervall=100, Anzahl=100, Laufzeit = 11 sec, msec pro Intervall=110

Intervall=1000, Anzahl=10, Laufzeit = 10 sec, msec pro Intervall=1000

Es scheint, dass System.Timers.Timer() nicht schneller als etwa 15 ms ticken kann, unabhängig von der der Intervalleinstellung.

Beachten Sie, dass keiner dieser Tests schien jede messbare CPU-Zeit zu verwenden, so dass die Grenze ist nicht die CPU, nur ein .net Einschränkung (Bug?)

Im Moment denke ich, dass ich mit einem ungenauen Timer leben kann, der alle 15 msec oder so eine Routine auslöst, und die Routine erhält eine genaue Systemzeit. Irgendwie seltsam, aber...

Ich habe auch ein Shareware-Produkt ZylTimer.NET gefunden, das behauptet, ein viel genauerer .net-Timer zu sein (Auflösung von 1-2 msec). Das könnte das sein, was ich brauche. Wenn es ein Produkt gibt, gibt es wahrscheinlich auch andere.

Nochmals vielen Dank.

4voto

Joel Martinez Punkte 45129

Sie müssen eine hochauflösender Timer wie z.B. QueryPerformanceCounter

4voto

AnthonyWJones Punkte 182582

Oberflächlich betrachtet lautet die Antwort so etwas wie "hochauflösender Timer", doch das ist falsch. Die Antwort erfordert eine regelmäßige Tick-Erzeugung und die Windows-API für hochauflösende Leistungszähler erzeugt keinen solchen Tick.

Ich weiß, dass dies keine Antwort an sich ist, aber die bisherige Antwort auf diese Frage ist so falsch, dass ich das Gefühl habe, dass ein einfacher Kommentar dazu nicht ausreicht.

3voto

Arno Punkte 4824

Die Begrenzung ist durch den Herzschlag des Systems gegeben. Die Standardeinstellung ist 64 Beats/s, was 15,625 ms entspricht. Es gibt jedoch Möglichkeiten, diese systemweiten Einstellungen zu ändern, um Zeitauflösungen von bis zu 1 ms oder auf neueren Plattformen sogar bis zu 0,5 ms zu erreichen:

  1. Mit Hilfe des Multimedia-Timer-Interface wird eine Auflösung von 1 ms angestrebt ( timeBeginPeriod() ):

    Siehe Abrufen und Einstellen der Timer-Auflösung .

  2. Übergang zu einer Auflösung von 0,5 ms mit Hilfe von NtSetTimerResolution() :

    Siehe Innerhalb von Windows NT Hochauflösende Zeitgeber .

Usted kann 0,5 ms erreichen Auflösung mit Hilfe der versteckten API NtSetTimerResolution() .

Ich habe alle Einzelheiten in este SO antworten.

2voto

Kinze Punkte 3650

In System.Diagnostics können Sie die Funktion Stoppuhr Klasse.

1voto

quamrana Punkte 32950

Aus dem Stegreif könnte ich vorschlagen, einen Thread laufen zu lassen, der meistens schläft, aber wenn er aufwacht, prüft er eine laufende QueryPerformanceCounter und löst gelegentlich Ihr Verfahren aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X