timer
-
Hallo leute,
ich möchte in VC++ in einem Abstand von zehn Millisekunden eine bestimmte Prozedur aufrufen. dass es mit Timer machbar weiss ich, und hab folgendes geschrieben:
void CTestDlg::OnTimer(UINT nIDEvent) { if (time = nIDEvent) { OnReadSlave; KillTimer(time); time = SetTimer(ID_CLOCK_TIMER,1000,NULL); } CDialog::OnTimer(nIDEvent); }das Ereignis ReadSlave muss nach zehn Millisekunden auslöst werden.
kann mir eine helfen
-
Switi schrieb:
dass es mit Timer machbar weiss ich
Siehst du, hier liegst du schon falsch.
Windows-Timer sind für solche Anwendungen weder gedacht noch geeignet. Du stellst deinen Timer übrigens auf eine Sekunde, nicht auf 10 ms.
Und das hier
OnReadSlave;ist kein Funktionsaufruf.
-
Der zweite Parameter von SetTimer() gibt dessen LAufzeit in Millisekunden an - also mußt du dort einfach eine 10 einstellen.
Btw, der Timer sendet in regelmäßigen Abständen eine WM_TIMER Message - d.h. du mußt ihn nur einmal starten (in der OnInitDlg()) und dann darauf warten, daß die OnTimer() aufgerufen wird.
-
Nimm den QueryPerformanceCounter.
findest Du auch in der MSDN.
-
kannst du mir vielleicht ein paar tips geben
-
CStoll schrieb:
Der zweite Parameter von SetTimer() gibt dessen LAufzeit in Millisekunden an - also mußt du dort einfach eine 10 einstellen.
Unter 50 ist ein Timer aber extrem ungenau.
-
es tut gar nichts
die OnReadSlave ist in einem fenster die vom ein haptfenster aufgerufen werden soll.
-
unsigned __int64 counts = QueryPerformanceCounter()gibt dir die Counts seit Systemstart
unsigned __int64 freq = QueryPerformanceFrequency()gibt dir die Counts pro Sekunde zurück.
Damit kannst Du Dir eine Timer-Klasse basteln, die auf ein paar µs genau ist.
-
1310-Logik schrieb:
Damit kannst Du Dir eine Timer-Klasse basteln, die auf ein paar µs genau ist.
Soweit zur Theorie...
-
Nur wers selber testet weiss es genau, schon klar.
Ich hab etwas mehr als 3Mio Counts pro Sekunde..mir reicht das..und um 10ms zu timen reichts auch..quelle: [urlhttp://www.mvps.org/directx/articles/selecting_timer_functions.htm]mvps[/url]
wurd letztens hier geposted, konnt den thread aber nicht mehr finden..
-
1310-Logik schrieb:
Ich hab etwas mehr als 3Mio Counts pro Sekunde..mir reicht das..und um 10ms zu timen reichts auch..
Um die Genauigkeit deiner Methode zu ermitteln, solltest du den maximalen Abstand zwischen zwei aufeinanderfolgenden Aufrufen ermitteln. Die Anzahl der Aufrufe pro Sekunde sagt ungefähr gar nichts über die Genauigkeit aus aus.
-
gibs Vielleicht bei vc++ eine wait funktion mit dem man sagen kann zb.warte50ms dann......
-
MFK schrieb:
1310-Logik schrieb:
Ich hab etwas mehr als 3Mio Counts pro Sekunde..mir reicht das..und um 10ms zu timen reichts auch..
Um die Genauigkeit deiner Methode zu ermitteln, solltest du den maximalen Abstand zwischen zwei aufeinanderfolgenden Aufrufen ermitteln. Die Anzahl der Aufrufe pro Sekunde sagt ungefähr gar nichts über die Genauigkeit aus aus.
demnach weniger als 5µs
http://www.mvps.org/directx/articles/selecting_timer_functions.htm
wurd letztens hier geposted, konnt den thread aber nicht mehr finden..edit: url geflickt
-
1310-Logik schrieb:
demnach weniger als 5µs
Was heißt "demnach"? Hast du das gemessen?
Ich rede vom maximalen Abstand, nicht vom durchschnittlichen.
-
nein ich habs nicht selbst getestet (sagte ich bereits), werds auch heut nicht mehr tun, keine Zeit.
Was heißt "demnach"? Hast du das gemessen?
Hast Du Dir den link angesehn? Ich bezog mich darauf.
Ich meine die Zahlen sind überzeugend...
Und selbst wenns 500µs dauert, für 10-50ms reichts und ist wohl auch besser als der Multimedia Timer.
-
1310-Logik schrieb:
Hast Du Dir den link angesehn? Ich bezog mich darauf.
Auch das sagt nichts über die Genauigkeit deiner Methode aus.
Es ist egal, wie lange der Aufruf der Timerfunktion dauert. Windows ist kein Echtzeitbetriebssystem. Es gibt keinerlei Garantie, dass der Thread, der in deiner Messmethode steckt, nicht auf unbestimmte Zeit angehalten wird. Schon wenn im normalen Betrieb dein Thread gerade nicht "dran" ist, können da etliche Millisekunden verstreichen, von denen du nichts mitbekommst.
-
MFK schrieb:
1310-Logik schrieb:
Hast Du Dir den link angesehn? Ich bezog mich darauf.
Auch das sagt nichts über die Genauigkeit deiner Methode aus.
Es ist egal, wie lange der Aufruf der Timerfunktion dauert. Windows ist kein Echtzeitbetriebssystem. Es gibt keinerlei Garantie, dass der Thread, der in deiner Messmethode steckt, nicht auf unbestimmte Zeit angehalten wird. Schon wenn im normalen Betrieb dein Thread gerade nicht "dran" ist, können da etliche Millisekunden verstreichen, von denen du nichts mitbekommst.
Das kommt aber auf die Thread Priorität an und darauf, was noch alles im Hintergrund läuft. Für "simple" Anwendungens sollte es reichen (für Games und sowas), wissenschaftliche Messungen im Nanosekunden Bereich kann man mit Windows natürlich nicht machen.
Die WM_TIMER Message steht aber ganz hinten an, und wird daher wohl als letztes in Frage kommen. Und darum mehm ich die bestmögliche Art zu timen, die mir bekannt ist. Du kannst mich aber gern aufklären obs noch was anderes gibt.
-
1310-Logik schrieb:
Für "simple" Anwendungens sollte es reichen (für Games und sowas),
Es geht hier aber offenbar weder um eine simple Anwendung noch um ein Spiel. Es geht anscheinend ums zeitkritische Ansteuern einer Hardware:
Switi schrieb:
das Ereignis ReadSlave muss nach zehn Millisekunden auslöst werden.
Und das kann deine Methode nicht, weil sie keine maximale Antwortzeit garantieren kann.
-
MFK schrieb:
1310-Logik schrieb:
Für "simple" Anwendungens sollte es reichen (für Games und sowas),
Es geht hier aber offenbar weder um eine simple Anwendung noch um ein Spiel. Es geht anscheinend ums zeitkritische Ansteuern einer Hardware:
Switi schrieb:
das Ereignis ReadSlave muss nach zehn Millisekunden auslöst werden.
Und das kann deine Methode nicht, weil sie keine maximale Antwortzeit garantieren kann.
Also, womit macht man den sowas?

-
Ich würde das in Hardware oder mit einem hinreichend schnellen Echtzeitbetriebssystem machen.
-
MFK schrieb:
Ich würde das in Hardware oder mit einem hinreichend schnellen Echtzeitbetriebssystem machen.
"in Hardware"..meinst Du direkt die clock ansprechen?
wie geht das denn? wär interessant..