Warteschleife mit <chrono> läuft zu langsam



  • Hallo zusammen,

    für eine Steuerung benötige ich verschiedene Warteschleifen im Bereich von Minuten, Sekunden oder Millisekunden.

    Ich habe probiert eine Schleife für Sekunden exemplarisch zu programmieren.

    Leider ist es so, dass die Schleife viel zu langsam ist.
    In meinem Beispiel sollte jede Sekunde eine Konsolenausgabe ausgegeben werden.
    Es passiert aber eher alle zwei Sekunden.

    Woran liegt das und wie kann ich das lösen?

    Die ganzen Timer müssen nicht super genau sein, aber eine Genauigkeit von mindestens 10% bezogen auf die Zeiteinheit wäre schon wünschenswert.

    Vielen Dank für die Hilfe 🙂

    #include <iostream>
    #include <chrono>
    
    using namespace std;
    
    int main (void)
    {
        int i=0;
    
        while(1)
        {
            std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
            std::chrono::system_clock::time_point verstrichen;
    
            do
            {
                verstrichen = std::chrono::system_clock::now();
            } while(std::chrono::duration_cast<std::chrono::seconds>(verstrichen - start).count()<=1);
    
            i++;
            cout<<i<<endl;
    
        }
    
        return 0;
    }
    


  • Logisch, wenn du in der Einheit Sekunden zählst und der innere while loop für eine Sekunde laufen darf, bleibt als nächst größe Zahl die Zwei Sekunden, richtig?

    Wenn du es genauer haben willst Mikro- oder Millisekunden.

    #include <iostream>
    #include <chrono>
    
    using namespace std;
    
    int main (void)
    {
        int i=0;
    
        while(1)
        {
            std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
            std::chrono::system_clock::time_point verstrichen;
    
            do
            {
                verstrichen = std::chrono::system_clock::now();
            } while(std::chrono::duration_cast<std::chrono::milliseconds>(verstrichen - start).count()<=1000);
    
            i++;
            cout<<i<<endl;
    
        }
    
        return 0;
    }
    

    Im übrigend wäre dir das sofort aufgefallen, wenn du dir auch mal die Zeit ausgegeben hättest, die du versuchst zu messen.



  • Vielen Dank für die Lösung 🙂

    Leider stehe ich aber gerade etwas auf dem Schlauch.

    Ich setze ja als Vergleich ein <=, wieso komme ich dann auf zwei Sekunden?
    Durch das = müsste es doch bei einer bleiben, oder nicht?

    Das die nächste Zahl eine zwei ist, ist logisch, aber wieso komme ich überhaupt bis zur zwei?

    Danke 🙂



  • Der innere Loop läuft solange die Bedingung wahr ist, also

    std::chrono::duration_cast<std::chrono::seconds>(verstrichen - start).count() <= 1
    

    D.h.
    - 0 sekunden kleiner gleich 1? ja -> keine Ausgabe
    - 1 Sekunden kleiner gleich 1? ja -> keine Ausgabe
    - 2 Sekunden kleiner gleich 1? nein -> Ausgabe



  • Vielen Dank,
    nun ist alles klar 🙂



  • Warum nimmst du eigentlich nicht einfach std::this_thread::sleep_for ?



  • TNA schrieb:

    Warum nimmst du eigentlich nicht einfach std::this_thread::sleep_for ?

    Weil ich es nicht kannte 😉

    Funktioniert super, vielen Dank für die Anregung 🙂


Anmelden zum Antworten