Query performance timer frequency

felix_1000

Grünschnabel
Hallo Programmierer

In einer Dialogbasierenden Anwendung soll periodisch ein Timerevent ausgelöst werden. Der Event soll präzise jede Millisekunde getriggert werden.

Mit dem Multimediatimer habe ich verschiedene Versuche gemacht. Bei Perioden >10ms funktioniert dies wunderbar. Bei Perioden <5ms werden zwar alle Timer Events ausgelöst jedoch ist die zeitliche Abfolge der Events nicht konstant. Z.Bsp. werden bei einer spezifizierten Zeit von 2ms gewisse Events bereits nach, 1ms andere wiederum erst nach 3ms ausgelöst, im Durchschnitt stimmt es aber schon.

Mit den Funktionen Queryperformancecounter() und Queryperformancefrequency() kann man ja ziemlich genau die Zeit messen. Meine Idee wäre es nun irgendwie eine Callback-Funktion zu programmieren, die mit Hilfe der obigen Funktionen exakt nach der gewünschten Zeit aufgerufen wird.

Ich habe keine Ahnung ob oder wie sich so etwas realisieren lässt. Hat jemand einschlägige Erfahrungen damit und könnte mir helfen. Bin für jeden Tip dankbar.

Danke und Gruess,
Felix
 
Re: Queryperformancetimer/frequency

Keine Chance ! :)

Im Ernst, Windows (und auch linux) ist kein echtzeit BS, du wirst eine garantierte eventlaufzeit von 1ms nie hinbekommen ....

In echtzeit BS .. arbeitest da auf tieferer Ebene mittels interrupts ....

Du musst dich damit abfinden, dass deine timerevents nur richtwerte sind, und schwankungen unterliegen ...
Diese schwankungen kannst du mit den RTC Werten wieder rausrechnen klar (hasst ja auch schon gemacht sonst keonntest ned sagen dass die timer so schwanken :) ), aber die schwankungen selber bleiben ...

Wozu braucht man timer im 1 ms bereich ? Sowas sollte man eigentlich nie brauchen ! Nich unter windows :)

Ciao ...
 
Re: Queryperformancetimer/frequency

Imo geht das auf Grund der Architektur von Windows nicht so genau (genauer als 10ms wirste nicht kommen).
 
Re: Queryperformancetimer/frequency

Hallo,

ich habe mal wieder in einem meiner Bücher gelesen und bin da vor kurzem auf das gestoßen:

(Es ging um die Framerate und ne exakte Zeitmessung)

(Zitat)
" Es gibt aber noch einen besseren Weg: den Performance Counter. Der Performance Counter ist ein Hardwarebaustein, der mit 3,19 MHz läuft. Dies entspricht einer Genauigkeit von weniger als einer Mikrosekunde"

Und das ist doch genau das was du willst.


Da ich eben in nem anderen Thread was zu timeSetEvent geschrieben habe, habe ich kurz in der MSDN nachgelesen. Diese Funktion arbeitet so:

Es wird ein Thread erstellt und der testet dann einfach immer wie viel Zeit vergangen ist und ruft dann immer die Funktion auf, zu der sie den Pointer hat.

Also einfach selbst nen Thread erstellen mit dem Performance Counter immer testen ob es soweit ist die Funktion aufzurufen und wenn ja dann einfach aufrufen
 
Re: Queryperformancetimer/frequency

Aber sowas dann bitte direkt in Assembler.
Denn ich glaube kaum das man das zuverlässig in C hinbekommt, denn einen Thread laufen zu lassen is die eine Sache, aber dann immer wieder abzufragen ob 1ms vergangen ist die andere, da kommt Zeit hinzu um die Funktion auf den Stack zu schieben, die Parameter ebenso und dann diese wieder herunterzunehmen. Das stell ich mir vor wenn mal der Prozessor ausgelastet wir.
Dazu sollte man wissen, wie Multithreading funktioniert!

Wie schon gesagt dürfte sowas nur mit einem Echtzeitsystem möglich sein, oder dann wirklich auf tieferer Ebene (Interupts, oder direkte Schaltungen, also Hardware).

Gruß Daniel
 
Re: Queryperformancetimer/frequency

Daniel Toplak hat gesagt.:
Wie schon gesagt dürfte sowas nur mit einem Echtzeitsystem möglich sein, oder dann wirklich auf tieferer Ebene (Interupts, oder direkte Schaltungen, also Hardware).

Nur leider lässt Windows NT direkten Hardwarezugriff nicht mehr zu (nur noch über Treiber).
 
Re: Queryperformancetimer/frequency

Es ist auch nie garantiert, wann der Thread wieder drankommt. Das hängt nämlich vom Scheduler ab. Du solltest auf jeden Fall die Priorität des Tastks hoch ansetzen.
 

Neue Beiträge

Zurück