Sleep-Funktion



  • Hallo Leute,

    ich habe vor kurzem angefangen ein Quiz mit C++ zu programmieren und es funktioniert auch schon ganz gut, bis auf zwei Dinge:

    1. Wie in der Überschrift will ich eine Sleepfunktion mit einem Countdown einbauen, aber ich weiss nicht genau wie. Ich weiss wie man den Sleep-Befehl schreibt und die Einheiten etc.
    aber der Countdown ist mein Problem. Ebenfalls kann ich mein Programm generell nicht pausieren...

    2. Mein zweites Problem ist, dass ich nachdem der Benutzer mit dem Quiz durch ist. Wieder zurück in das Menü gelangt und die Konsole komplett leer ist.

    Da trifft sich alles ich will erreichen, dass sich die Konsole 'cleant' und davor ein countdown abläuft. Damit man bei bedarf das Quiz einfach wieder starten kann.

    Ich hoffe ihr wisst, was ich meine.

    Zum Schluss hier noch mein Code:

    Code:
    
    #include <cstdlib>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main(int argc, char *argv[]) {
    
        int option;
        option = 800;
        string antwort;
        string antwort2;
        string antwort3;
        string antwort4;
        string antwort5;
        string antwort6;
        string antwort7;
        string antwort8;
        string antwort9;
        string antwort10;
        bool run = true;
    
        cout << "Quiz" << endl;
        cout << "Herzlich Willkommen zu einem kleinen Quiz." << endl;
        cout << "Das Quiz wird aus 10 Fragen bestehen, die Sie zu beantworten haben." << endl;
        cout << "Dieses Quiz handelt von Mathematik." << endl;
    
        while (run == true) {
    
        cout << "Menue" << endl;
        cout << "Bitte waehlen Sie eine Option aus und geben Sie die Zahl ein," << endl;
        cout << "die vor der Option steht: " << endl;
        cout << "1. Quiz starten" << endl;
        cout << "2. Programm beenden" << endl;
        cin >> option;
    
        if (option == 1) {
           cout << "Sie haben das Quiz gestartet." << endl;
           cout << "Einen Tipp noch: Sollte eine Antwort falsch sein gelangen Sie direkt wieder zurück zum Menue." << endl;
           cout << "Es geht los. Erste Frage:" << endl;
           cout << "Wie viel ergibt 25 multiplitziert mit 32?" << endl;
           cin >> antwort;
    
        if (antwort == "800") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Zweite Frage:" << endl;
           cout << "Von wem stammt dieser Satz?:" << "a² + b² = c²" << endl;
           cout << "Tipp: Das graue Feld steht fuer 'zum Quadrat'." << endl;
           cin >> antwort2;
        }
    
        if (antwort2 == "Pythagoras") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Dritte Frage:" << endl;
           cout << "Als was bezeichnet man einen Koerper mit 2 Parallelen?:" << endl;
           cin >> antwort3;
        }
    
        if (antwort3 == "Parallelogram") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Vierte Frage:" << endl;
           cout << "Was laesst sich mit der Formel: Pi multiplitziert mit r² berechnen?:" << endl;
           cin >> antwort4;
        }
    
        if (antwort4 == "Kreisflaeche") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Fuenfte Frage:" << endl;
           cout << "Wie viel Euro Zinsen bekommt Max bei einem Kontostand von 5000€ und einem Zinssatz von 1,25%?:" << endl;
           cout << "Tipp: Bitte einfach nur die Zahl hinschreiben." << endl;
           cin >> antwort5;
        }
    
        if (antwort5 == "62,5") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Sechste Frage:" << endl;
           cout << "Wie lauten die ersten Sechs Stellen hinter Pi?:" << endl;
           cout << "Tipp: 3,...... " << "Bitte nur die Zahlen hinter dem Komma auffuehren" << endl;
           cin >> antwort6;
        }
    
        if (antwort6 == "141592") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Siebte Frage:" << endl;
           cout << "Was ergibt 100 multiplitziert mit 100?:" << endl;
           cout << "Tipp: Gebe die zahl ohne Punkt oder Komma ein." << endl;
           cin >> antwort7;
        }
    
        if (antwort7 == "10000") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Achte Frage:" << endl;
           cout << "Wie viel Kubikmeter sind 1 Kubikkilometer?:" << endl;
           cout << "Tipp: Gebe die zahl ohne Punkt oder Komma ein." << endl;
           cin >> antwort8;
        }
    
        if (antwort8 == "1000000000") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Neunte Frage:" << endl;
           cout << "Von wem ist dieser Satz: ax² + bx + c = 0?:" << endl;
           cin >> antwort9;
        }
    
        if (antwort9 == "Vieta") {
           run = true;
           cout << "Richitg!" << endl;
           cout << "Zehnte Frage:" << endl;
           cout << "Was ergibt 20 dividiert durch 0?:" << endl;
           cin >> antwort10;
        }
    
        if (antwort10 == "Geht nicht") {
           run = true;
           cout << "Ganz genau, Super!" << endl;
           cout << "Du hast nun das ganze Quiz mit Erfolg bestanden!" << endl;
           cout << "Du kannst stolz auf dich sein!" << endl;
           cout << "Das Menue ruft sich automatisch in Fuenf Sekunden wieder auf..." << endl;
        }
    
    }        
    }
    
        if (option == 2) {
        cout << "Das Quiz wird sofort beendet." << endl;
        return 0;
        }
    
        return 0;       
    }
    

    Es ist erst mein zweiter Code also tut es mir Leid ich habe noch einiges zu lernen. Ich weiss auch, dass es teilweise sehr umständlich gemacht ist :/. Naja muss halt noch lernen. (:

    Freundliche Grüße
    12kukan



  • Wilst du eine Art Coun tdown der fon 3 auf 0 runterzählt dan probier es so:

    ...
    cout << "3";
    Sleep(1000);
    system("cls");
    cout << "2";
    Sleep(1000);
    system("cls");
    cout << "1";
    Sleep(1000);
    system("cls");
    cout << "0";
    ...
    

    Ist zwar nicht gerate die beste lösung aber dafür sehr einfach.
    ( geht nur unter Windows )

    Hy wusstest du das du alle Befehle die du in system("") zwischen die Anführungszeichen schreibst auch in cmd als befehl eingeben kannst 😕
    nur so als tipp.

    Und wenn du wider nach oben springen willst nim goto:

    ...
    start:
    ...
    ...
    goto start;
    ...
    


  • Ist gar nicht schlecht fürs zweite Programm.
    Die Konsole kannst du mit system("cls"); löschen. Sollte so ziemlich überall funktionieren (cls ist keine C++-Funktion, sondern ein Konsolenbefehl/Programm, sollte aber überall gehen).

    Ich bin mir nicht so sicher was du mit den Fragen meinst.

    for (int i = 5; i; i--){
    	sleep(1); //je nach Betriebssystem ist sleep ein bisschen anders
    	system("cls");
    	cout << "Neustart in " << i << " Sekunden";
    }
    

    😕

    Noch ein paar Anmerkungen:
    Was tut run? Es ist immer true und wird nie auf false gesetzt.
    Gibt es einen Grund, dass du antwort2 bis antwort10 benutzt? Du kannst einfach immer wieder antwort benutzen.
    Versuche die Tags [cpp] statt [code] zu benutzen, dann siehts etwas bunter aus.
    Versuche auch korrekt einzurücken. Es sah so aus, als würdest du auf option==2 gar nicht reagieren, aber das sieht nur so aus.

    Bitte nimm kein goto, jedesmal wenn du das tust stirbt ein kleines Kätzchen. 😞



  • Natürlich ist goto eine sehr schlechte Variante aber ich habe mir das so angewöhnt weil es gab mal eine Zeit da hab ich die while-Schleife nicht ferstanden und mit gewohnheiten ist schwer zu brechen...

    MfG, cppfan.

    PS: was meinst du mit "stirbt ein kleines Kätzchen."



  • for(int i=10 ; i > 0 ; i--)
    {
      cout<<"Start in: " << i << "seconds \n";
      Sleep(1000);  // 1000 miliseconds = 1 second
    }
    cout<<"Fire! :D\n";
    


  • cppfan schrieb:

    PS: was meinst du mit "stirbt ein kleines Kätzchen."

    Er will damit sagen das du goto nicht verwenden sollst. ^^

    Hier der Countdown mit while:

    int i=10;
    while(i!=0)
    {
     cout<<"Start in: "<<i<<" seconds\n";
     Sleep(1000);
     i--;
    }
    cout<<"Fire!\n";
    


  • Wir sind hier in der Rubrik WinApi. Sleep ist ungeeignet, weil er den gesamten Prozess schlafen legt.
    Besser über einen Timer nachdenken, weil damit zwischenzeitlich etwas anderers gemacht werden kann.



  • berniebutt schrieb:

    Wir sind hier in der Rubrik WinApi. Sleep ist ungeeignet, weil er den gesamten Prozess schlafen legt.
    Besser über einen Timer nachdenken, weil damit zwischenzeitlich etwas anderers gemacht werden kann.

    Diese Erklärung ist so nicht ganz korrekt. Sleep unterbricht einfach die Ausführung des Threads, in dem Sleep aufgerufen wird. Ist dies der Hauptthread, dann ist das so, dass der Prozess quasi schläft, andere Threads aber weiterhin ausgeführt werden.

    Einen dynamischen Timer kann man z.B. so programmieren.

    #define TIME_TO_SLEEP 5000
    
    DWORD dwCurrent = GetTickCount();
    DWORD dwInitial = GetTickCount();
    //....
    dwCurrent = GetTickCount();
    if (dwCurrent > dwInitial + TIME_TO_SLEEP) {
        dwInitial = GetTickCount(); //Falls der Timer wieder von neu starten soll
        printf("%d seconds have elapsed\n", TIME_TO_SLEEP);
        //... Do something here
    }
    

    GetTickCount liefert dir als Rückgabewert die Anzahl an Millisekunden, die seit dem letzten Systemstart vergangen sind. Im obigen Code werden zwei Timer mit GetTickCount() initialisiert. Der dwStart Timer holt sich weiterhin die vergangenen Millisekunden. Ist dieser größer als der Initialwert + die angegebenen Millisekunden (die zu "warten" sind), dann ist die Zeit um.

    Einen Timer so zu programmieren ist praktisch, da du weiterhin andere Operationen im Main-Thread ausführen lassen kannst.



  • Fehler meinerseits:

    printf("%d seconds have elapsed\n", TIME_TO_SLEEP / 1000);

    und

    Der dwStart Timer holt...

    -dwStart +dwCurrent



  • ...


Anmelden zum Antworten