Tick und Millisekunden werden nur alle 12-16 ms aktualisiert?
-
Hallo,
ich habe da folgendes Problem mit einer Win32-Consolen-Anwendung (compiliert mit VisualC++ 2005), läuft unter Windows XP im DOS-Fenster (3500+ AMD, DOS-Fenster mit verschiedener Priorität getestet):
Wenn ich folgenden Code ablaufen lasse:
#include <iostream> #include <windows.h> #include <time.h> #include <sys/timeb.h> #include <i2cbridge.h> using namespace std; void main() { DWORD zeit; while (1) { zeit=GetTickCount(); cout<<zeit<<endl; }; };bekomme ich im DOS-Fenster folgende Ausgabe:
12091921
12091921
12091921
12091921 (ca. 80 Zeilen untereinander)
12091937 (ca. 80 Zeilen untereinander)
12091953 (ca. 80 Zeilen untereinander)Es vergehen also ca. 13-16 Millisekunden, bis der Tick-Wert aktualisiert wird. Dasselbe passiert mir, wenn ich clock(), _ftime64_s oder pQueryPerformanceCounter benutze.
Was passiert da? Da er 80 Zeilen mit demselben Wert untereinander schreibt, kann das Programm ja nicht zu langsam sein, aber anscheinend wird der Tick und auch die Millisekunden nur alle 13-16ms aktualisiert?

Hat jemand eine Idee, warum das so ist, und wie ich das ändern kann, denn meine Anwendung braucht die Zeit wesentlich genauer als ca. alle 16ms

Viele Grüße,
Manfred
-
-
Mit QueryPerformanceCounter sollte es gehen, wie sieht denn dein Code dafür aus?
mfg.
-
Hallo,
vielen Dank für die Tipps, ich habs jetzt geschafft.
Vorher hab ich zwar das Forum durchsucht, der eine Thread ist mir aber durch die Lappen gegangen.
Der Code sieht jetzt folgendermaßen aus und funktioniert:LARGE_INTEGER iFreq; QueryPerformanceFrequency(&iFreq); printf("Frequency : %20d\n",iFreq.QuadPart); LARGE_INTEGER iBegin, iEnd; QueryPerformanceCounter(&iBegin); Sleep(10); QueryPerformanceCounter(&iEnd); printf("Time : %4.15f\n s",(double)(iBegin.QuadPart)/iFreq.QuadPart); printf("Time : %4.15f\n s",(double)(iEnd.QuadPart)/iFreq.QuadPart);Viele Grüße,
Manfred
-
[...]
mein nachredner hat absolut recht, darum hab ich den geistigen duennpfiff mal entfernt

wenn man gezielt auf eine veraenderung des tickcounts wartet, liegen dazwischen immer 16ms:
unsigned int preTime= GetTickCount(); unsigned int curTime; while (true) { do { curTime= GetTickCount(); } while (curTime==preTime); printf("%d \n", curTime); preTime= curTime; }
-
Das mit der konsole glaub ich nicht.
Hab's so probiert:#include <iostream> #include <vector> int _tmain(int argc, _TCHAR* argv[]) { using namespace std; const DWORD rounds = 1000000; vector<DWORD> ticks; ticks.resize(rounds); int i; for (i = 0; i < rounds; i++) ticks[i] = ::GetTickCount(); for (i = 0; i < rounds; i++) cout << ticks[i] << endl; return 0; }Da bekommt man auch die gleiche Zahl x mal (ich denke öfter als mit direkter Ausgabe)