QueryPerformanceCounter als Zustandszähler
-
Ich nutze momentan SetTimer für einen Zustandszähler. Der ist mir jetzt allerdings zu ungenau. Ich habe vom QueryPerformaceCounter in msdn gelesen und würde nun gerne den benutzen. Leider bin ich noch etwas grün hinter den Ohren was C++ angeht und weis nicht wie ich den jetzt anwenden kann damit er mir eine Variable sagen wir mal alle 0.01 ms hochzählt. Kann mir da wer helfen? Bei SetTimer ging das ja problemlos da er die TimerProc immer wieder aufruft und man darin einfach ++var; rechnen kann. Geht das mit dem QPC auch so einfach? Bin über denen Hinweis dankbar.
-
QueryPerformanceCounter nimmt man, um die Zeit zu messen. Wenn du damit einen Timer nachbauen willst, musst du in einer Schleife ständig die Zeit lesen und mit einem Ausgangswert vergleichen, bis dein Intervall erreicht ist und du etwas ausführen kannst. Damit nebenher auch noch was anderes laufen kann, sollte das Ganze unbedingt in einem eigenen Thread laufen. So ganz trivial ist das für einen Anfänger vielleicht nicht...
-
Gibts denn dann vielleicht einen einfachen Counter der hochauflösend ist?
-
Sorry ich meinte Timer.
-
Vieleicht kannst du uns dein Problem erklären, damit wir dir evtl. eine Alternativlösung bieten können die nicht auf einen µs Timer angewiesen ist.
Ansonsten ist der QueryPerformanceCounter das genauste was du bekommen kannst, aber eben nicht so einfach wie _matze schon sagte.
-
Im Grunde muss ich sehr schnell bestimmte Zustände erreichen um eine sehr genaue Ausgabe zu erhalten. Ich nutze eigentlich MFC, dachte aber das Thema passt hier besser da es ja nicht MFC speziell ist. Ich starte also etwas über einen Button und eine Anzeige gibt mir dann die Werte aus, wenn ich wieder stoppe soll der ganz genaue Wert angezeigt werden. Da ich aber 300 Werte pro 4 ms habe brauche ich eben eine sehr genaue Zählung. Verständlich?
Wenn ich einen Thread aufsetze und den dann so stark auslaste, gibt es dann nicht auch Ungenauigkeiten?
-
miamalzu schrieb:
Wenn ich einen Thread aufsetze und den dann so stark auslaste, gibt es dann nicht auch Ungenauigkeiten?
Ungenauigkeiten gibt es immer. Windows ist kein Echtzeit-OS. Du kannst lediglich versuchen, diese Ungenauigkeiten klein zu halten, indem du eine möglichst genaue Methode der Zeitmessung wählst (QPC), deinen Code schlank und performant gestaltest, und vielleicht das OS so nutzt, dass es möglichst wenig stört (denn nicht nur deine eigenen Threads können deinen Ablauf verzögern; ein wenig mehr Sicherheit verschafft das Heraufsetzen der Thread-/Prozesspriorität).
-
Im übrigen was die Genauigkeit von QueryPerformanceCounter betrifft:
http://support.microsoft.com/kb/274323Grüssli
-
Dravere schrieb:
Im übrigen was die Genauigkeit von QueryPerformanceCounter betrifft:
http://support.microsoft.com/kb/274323Grüssli
Ach, die Übersetzungen von MS sind doch immer noch die besten!
Ich werde immer ganz zittrig, wenn ich nicht auf Anhieb den Button zum Umstellen der Sprache erwische...
-
_matze schrieb:
Dravere schrieb:
Im übrigen was die Genauigkeit von QueryPerformanceCounter betrifft:
http://support.microsoft.com/kb/274323Grüssli
Ach, die Übersetzungen von MS sind doch immer noch die besten!
Ich werde immer ganz zittrig, wenn ich nicht auf Anhieb den Button zum Umstellen der Sprache erwische...
<pm>
<to>_matze</to>
<msg>Stell die gewünschte Sprache für Websites in deinem Browser um, dann musst du nicht mehr nach dem Button suchen ;)</msg>
</pm>Grüssli
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
_matze schrieb:
Ungenauigkeiten gibt es immer. Windows ist kein Echtzeit-OS.
Stimmt! Aber auch ein Echtzeit-OS würde wenig helfen, da die X86 Architektur (also die Hardware) nicht echtzeitfähig ist.