C++ Timerungenauigkeit



  • Hallo zusammen,
    Ich habe mir gerade mal einen Timer in C++ zusammengeschrieben, stelle aber fest, dass wenn ich ihn mit anderen Timern vergleiche, dass er langsamer ist, die Sekunden also theoretisch langsamer vergehen. Dies kann normalerweise ja nicht sein, aber ich weiß auch nicht an was es liegt. Vielleicht kann mir ja jemand von Euch helfen.
    Vielen Dank schon mal!

    LG Daniel

    #include <conio.h>
    #include <thread>
    #include <chrono>
    #include <iostream>
    #define KBCHECK if(_kbhit()==1){break;}
    
    int main()
    {
      int hours = 0;
      int minutes = 0;
      int seconds = 0;
      int milliseconds = 0;
      int timing = 0;
      std::cout << "Press \"return\" to start the timer. \n Press any key to stop it." << std::endl;
      std::cin.get();
    timing:
      for (timing=0;timing = 60;timing++) {
        milliseconds++;
        if (milliseconds == 1000) {
          seconds++;
          milliseconds = 0;
          if (seconds == 60) {
            minutes++;
            seconds = 0;
            if (minutes == 60) {
              hours++ ;
              minutes = 0;
            }
          }
        }
        KBCHECK
          std::this_thread::sleep_for(std::chrono::milliseconds(1));
          goto timing;
      }
      char flush = _getch();
      std::cout << "Your time: " << std::endl;
      std::cout << hours << ":" << minutes << ":" << seconds << "," << milliseconds << std::endl;
      std::cout << "\n \n Press any key to exit the programm." << std::endl;
      while (true) {
        KBCHECK
      }
      return 0;
    }
    

    Mod-Edit (camper): Code-Tags korrigiert



  • Bei std::this_thread::sleep_for(std::chrono::milliseconds(1)); kannn dein Programm laenger als eine Millisekunde schlafen. Dein Ansatz einen Timer zu programmieren ist deshalb grundsaetzlich falsch und wird so nie funktionieren.


  • Mod

    Das beobachtete Verhalten ist zu erwarten.

    std::this_thread::sleep_for(std::chrono::milliseconds(1));
    

    bedeutet ja nicht, dass der Thread nach genau 1 Millisekunde aufwacht, sondern nur, dass mindestens soviel Zeit vergehen soll. Im Übrigen benötigt die Ausführung deines eigenen Codes eine gewisse Zeit, so dass die Uhr selbst dann, wenn sleep exakt 1 Millisekunde dauern würde, etwas langsamer gehen würde.



  • Wer hat Dir goto beigebracht?


Anmelden zum Antworten