While-Schleife unterbrechen



  • Hallo,

    ich hab mal eine einfache Frage, ich hab eine while Schleife die soll durchgängig laufen und nur durch einen Tastendruck, zum Beispiel der Taste p unterbrochen werden, und durch ein abermaliges Drücken der Taste p fortgesetzt werden, doch wie kann ich das verwirklichen?
    Ich dachte mir erst mit

    If(getchar() != 'P') ..;
    

    doch dadurch wartet die while-Schleife ja, sie soll aber weiterlaufen und nicht warten 😕



  • kbhit sollte eine einfache Möglichkeit sein, http://www.c-plusplus.net/forum/39320. Du prüfst ob eine Taste gedrückt wurde und pausierst dann solange bis wieder eine Taste gedrückt wurde.



  • _kbhit und _getch aus der conio.h können sowas, allerdings ist das Windows proprietär


  • Mod

    Unelegante Möglichkeit:
    - Irgendwo einen Signalhandler oder meinetwegen auch eine direkte Abfrage im Code einbauen. Durch diese wird gegebenenfalls ein Flag gesetzt oder nicht gesetzt. Deine Schleife sieht dann so aus:

    while(Bedingung)
    {
     if (flag gesetzt)
      normaler_code();
     else
      tue_nichts();  // Zum Beispiel sleep()
    }
    

    Eleganter:
    - So wie oben, aber anstatt dem "busy waiting" packst du die while-Schleife in einen eigenen Thread und benutzt die Funktionen zur Threadsynchronisierung, um den Thread anzuhalten, bzw. zu starten.

    Du merkst sicher schon, beide Möglichkeiten sind eher kompliziert. Aus der Art, wie du deine Frage stellst (und dass du sie überhaupt stellen musst) schließe ich mal, dass dies noch weit über deinem derzeitigen Kenntnisstand ist. Ich vermute zusätzlich (ich habe ja auch mal mit dem Programmieren angefangen), dass deine Pause-Funktion gar nicht wirklich nötig ist und du bloß möchtest, dass dein Programm auch die ganzen coolen Features hat, die man von "richtigen" Programmen kennt. Mach das nicht! Lern erst einmal vernünftig programmieren! Diese ganzen coolen Features haben die coolen Programmierer der coolen Programme gar nicht selber geschrieben. Die benutzen einen fertigen Baukasten (ein Framework, siehe die Foren weiter oben in der Forenübersicht), der irgendwann einmal von mehr oder weniger klugen Leuten geschrieben wurde. Wenn du so weit bist, selber diese Baukästen zu benutzen, dann bekommst du diese ganzen coolen Features fast geschenkt. Wenn du versuchst, die alle selber zu implementieren, brichst du dir bloß einen ab und wirst frustriert.



  • ich hab grad ein ähnliches Problem.
    Ich hab im i-net einen kbhit header gefunden der auch funktioniert

    /* kbhit.h */
    
    #include <sys/select.h>
    
    int kbhit(void)
    {
    struct timeval tv;
    fd_set read_fd;
    
    tv.tv_sec=0;
    tv.tv_usec=0;
    FD_ZERO(&read_fd);
    FD_SET(0,&read_fd);
    
    if(select(1, &read_fd, NULL, NULL, &tv) == -1)
    return 0;
    
    if(FD_ISSET(0,&read_fd))
    return 1;
    
    return 0;
    }
    

    jetzt hab ich versucht damit und mit ncurses.h und getch() einen tastendruck abzufragen

    #include <iostream>
    #include <own/kbhit.h>
     #include <stdio.h>
     #include <ncurses.h>
    
    using namespace std;
    
    int main()
    {
    int a;
    
    while(!kbhit());
    a= getch();
    cout << a;
    return 0;
    
    }
    

    allerdings gibts dann die fehlermeldungen

    obj/Debug/main.o||In function main':| /home/fakka/Dokumente/cpp/kbhit/main.cpp|13|undefined reference tostdscr'|
    /home/fakka/Dokumente/cpp/kbhit/main.cpp|13|undefined reference to `wgetch'|
    ||=== Erstellen beendet: 2 Fehler, 0 Warnungen===|

    wenn man danach googelt steht überall man soll ncurses dazu linken.
    meine frage ist jetzt welche datei soll ich dazu linken und wo find ich die?



  • hat sich erledigt.
    habs hin bekommen.

    sieht jetzt so aus:

    #include <iostream>
    #include <stdio.h>
    #include <ncurses.h>
    
    using namespace std;
    
    int main()
    {
    initscr();
    int c = getch();
    endwin();
    cout << c;
    
    }
    

Anmelden zum Antworten