Stopuhr-Timer-Help
-
Hallo,
wie bereits im Titel zu lesen ist geht es um eine Stopuhr. Ich möchte in einen meiner Programme eine Stopuhr einbauen. Wenn möglich würde ich die gemessene Zeit in Millisekunden angeben. Ich würde mich aber mit einer Genauigkeit im Sekunden bereicht zufrieden stellen. Was ich weis ist das dies mit den Header-Datei <ctime> oder <time.h> geht.(Wenn nicht bitte korrigieren).So und jetzt hörts eigentlich schon auf. Ich hab schon auf diversen Seiten und unter MSDN gesucht und auch was gefunden, womit ich leider nicht viel anfangen konnte. Jetzt sehe ich nur noch den "erbärmlichen" ausweg und es mir vorkauen zu lassen. Ich hab schon eine kleines Testprogramm geschrieben.Das mir erstmal nur die Millisekunden zahl ausgeben soll bzw. in einer int/long Variable speichern soll.
der Code:#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main(int argc, char *argv[]) { CTime Datum; Datum = GetCurrentTime(); cout << Datum.getMilliseconds() << endl; system("PAUSE"); return EXIT_SUCCESS; }Auf Kommentare kann ich (denk ich) in so einen kleinen Programm verzichten.Ich bin mir bei den Code klar das es vollkommener Schwachsinn ist (alleine wegen den fehlern). Was ich euch nun bitte ist: mir ein programm vorzustellen womit ich Millisekunden / Sekunden ausgeben kann oder in einer Variable speichern kann und mir vielleicht kurz erklären was ich falsch gemacht habe.
Mit freundlichen Grüßen
-
Hm.
struct time t; gettime(&t); long millisecs=t.ti_hour*60*60*100+t.ti_min*60*100+t.ti_sec*100+t.ti_hund; //TU WAS gettime(&t); long millisecs2=t.ti_hour*60*60*100+t.ti_min*60*100+t.ti_sec*100+t.ti_hund; printf("%i msecs needed!",(millisecs2-millisecs)*10);Ist die nich so ganz genaue Methode, aber so ähnlich funzt es bei mir...
-
Also ich hab das gerade probiert. Ich habe den code fast 1 zu 1 übernommen.
#include <cstdlib> #include <iostream> #include <time.h> #include <ctime> using namespace std; int main(int argc, char *argv[]) { int test; struct time t; gettime(&t); long millisecs=t.ti_hour*60*60*100+t.ti_min*60*100+t.ti_sec*100+t.ti_hund; //TU WAS cin >> test; gettime(&t); long millisecs2=t.ti_hour*60*60*100+t.ti_min*60*100+t.ti_sec*100+t.ti_hund; printf("%i msecs needed!",(millisecs2-millisecs)*10); system("PAUSE"); return EXIT_SUCCESS; }Und ich bekomme 2 Fehler. Sie lauten
-"aggregatetime t' has incomplete type and cannot be defined" -"gettime' undeclared(first use this funtion)"Noch was, kennst du gute Literatur zu den Thema?
Grüße Simon
-
Hallo,
Standard C++ bietet leider keine Zeit-Funktionen im Millisekundenbereich. So wie es aussieht, benutzt du das Betriebssystem Windows. Die Win32-API bietet eine Funktion zum Auslesen der Systemzeit in Millisekunden unter dem "tollen" Namen timeGetTime an. Wenn man sie benutzen will, darf man nicht vergessen gegen winmm.lib bzw. libwinmm.a zu linken. Wenn man MinGW benutzt, kann man natürlich auch, ohne eine import-lib zu benutzen, direkt gegen die winmm.dll, die sich im Verzeichnis \Windows\system32 befindet, linken.#include <windows.h> #include <iostream> using namespace std; int main() { DWORD start = timeGetTime(); //Dinge, die gemessen werden sollen cout << "Messung in Millisekunden: " << (timeGetTime() - start); }
-
Ahhhh, vielen dank!!! Ich hab zuerst ein bisschen Probleme mit dem Linker gehabt aber nach der suche im Ordner der Compilers auch gleich gefunden.
Grüße Simon
-
Konstruktör schrieb:
Standard C++ bietet leider keine Zeit-Funktionen im Millisekundenbereich.
Natürlich tut C++ das
clock(). Dürfte für Ernder vollkommen ausreichen.
-
Stimmt, mit clock() kann man es auch machen:
#include <ctime> inline clock_t clockInMSec() { return static_cast<clock_t>(clock() * (1000.0/CLOCKS_PER_SEC)); }Danke für den Hinweis.
-
am besten :
#include <iostream> #include <ctime> using namespace std; int main() { int start = clock(); int warteZeitInSekunden = 3; while((clock()-start)/CLOCKS_PER_SEC < warteZeitInSekunden); system("PAUSE"); return 0; }
-
Hallo,
ich sitze gerade an dem selben Problem und hab das ganze mal ein bischen getestet, dabei ist mir aufgefallen das das ganze im sekundenbereich noch ganz gut funktioniert, aber sobald man aber auf 100ms oder 10 ms geht läuft das ganze ziehmlich ungenau (auf 1 minute ca. 3 s abweichung bei 100ms steps).Wodran kann das liegen? gibt es eine möglichkeit das ganze genauer hin zu bekommen?
ich bräuchte eigenlich einen Timer der mir 10ms schritten eine funktion aufruft. deshalb hab ich das ganze in einem Thread gepackt und dabei halt festgestellt das die ganze sache so ungenau ist wie ein Timer bei VLC.
-
Suche mal nach QueryPerformanceCounter.
Damit kann man auch im Millisekundenbereich
arbeiten.Gruß,
Andreas
-
std::clockkann ziemich ungenau sein, vor allem im Millisekunden bereich. Auf Windows hatstd:clock, glaub ich, eine Auflösung von 16ms. Für sehr genaue Zeitmessungen also nicht zu gebrauchen.Eine Standard C++ Variante für hochauflösende Timer gibt es nicht. Da muss man auf die API des Betriebsystem zurückgreifen. Nachfolgendes gilt für Windows, bei den anderen Betriebsystemen kenne ich mich nicht aus.
Du kannst timeGetTime verwenden, da erreichst du bei entsprechender Einstellungen (timeBeginPeriod, timeEndPeriod) eine Auflösung von 2ms.
Um wirkliche sehr genaue Zeitmessungen durchzuführen, musst du wohl auf QueryPerformanceCounter und QueryPerformanceFrequency zurückgreifen. Diese haben meistens eine Auflösung, welche sogar genauer als eine Millisekunde ist. Da kommst du in den Mikrosekunden-Bereich rein.Grüssli
-
Danke,
hab das mit QueryPerformanceCounter hin bekommen. Hab selbst bei 1ms tackt keine abweichung auf mehrere Minuten.
