Stopuhr-Timer-Help



  • 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
    -"aggregate time 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


  • Administrator

    std::clock kann ziemich ungenau sein, vor allem im Millisekunden bereich. Auf Windows hat std: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. 👍


Anmelden zum Antworten