schleifenabbruch auf tastendruck



  • Hallo Leute,

    ich bin hier neu im Forum, weil ich n kleines Problem hab, folgendes:

    Ich möchte eine Schleife programmieren, die abbricht, wenn der Benutzer den Buchstaben 'q' drückt, allerdings ohne, dass die Schleife auf den jeweiligen Tastendruck wartet, wie man es z.B. vom cin.get() kennt.
    Da ich unter Linux arbeite, steht mir kbhit() nicht zu Verfügung und auch per copyandpaste funktioniert kbhit() nicht so, wie gewünscht.

    Ich hab ein paar Sachen über multithreads gelesen oder über GetAsyncKeyState, weiß allerdings nicht ob das genauso funktioniert bzw. ob es nicht einfacherer Methoden gibt.

    Ich hoffe ihr könnt mir da helfen 🙂

    MfG
    Thunderwulf91



  • Die von dir genannten Funktionen sind Windows-Funktionen. Fuer Linux suchst du wohl nach ncurses.
    Das sollte eigentlich auch schon installiert sein.



  • ja eben, das ist halt auch irgendwo das Problem mit den Windowsfunktionen.
    von ncurses hab ich schon gehört, habe allerdings keine Ahnung, wie man mit ncurses umgeht und was diese so alles mit sich bringt



  • Thunderwulf91 schrieb:

    ja eben, das ist halt auch irgendwo das Problem mit den Windowsfunktionen.

    Die sind auch nicht für "irgendwo", sondern für Windows - welche Überraschung ...



  • Belli schrieb:

    Thunderwulf91 schrieb:

    ja eben, das ist halt auch irgendwo das Problem mit den Windowsfunktionen.

    Die sind auch nicht für "irgendwo", sondern für Windows - welche Überraschung ...

    Dass diese Funktionen, Windowsfunktionen sind war mir bereits vorher klar, ich suche hier lediglich eine Möglichkeit das in Linux umzusetzen oder auf andere Dinge zurückzugreifen, die evtl. vom Einfachheitsgrad mit kbhit ähnlich sind.
    Dumme Bemerkungen kann im Forum btw. niemand gebrauchen 👍



  • Jaja, erstmal rummeckern.
    Ich habe dir geraten, dir ncurses anzusehen, wenn du darauf nur

    von ncurses hab ich schon gehört, habe allerdings keine Ahnung, wie man mit ncurses umgeht und was diese so alles mit sich bringt

    antwortest, kann man dir auch nicht helfen. Was meinst du, wozu es Dokumentationen, manpages etc. gibt?
    Edit: koennte ja zu schwierig sein, mit google zu suchen:

    http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/



  • also aus den manpages wurde ich bisher nicht wirklich schlau und auch sonst aus einigen docs über ncurses nicht. Dein Link hat mir allerdings geholfen, daher schonmal danke 👍
    Abgesehen davon, mecker ich nur, weil man manch unnötige Kommentare einfach nicht gebrauchen kann, dafür ist ein Forum eben nicht da



  • Gibts unter Linux denn keine API zu den OS-Funktionen, so wie unter Windows?



  • Thunderwulf91 schrieb:

    Abgesehen davon, mecker ich nur, weil man manch unnötige Kommentare einfach nicht gebrauchen kann, dafür ist ein Forum eben nicht da

    Unnötig ist es, über Windows-Funktionen zu lamentieren, wenn man unter Linux programmiert.



  • Belli schrieb:

    Gibts unter Linux denn keine API zu den OS-Funktionen, so wie unter Windows?

    linux funktioniert anders. Schlanker Kernel, der rest alles externe Pakete. Insofern ist ncurses wohl das, was am nächsten zu "den OS-Funktionen" kommt.



  • Man braucht nicht direkt ncurses, sondern kann auch die Tastatur so umstellen, dass Input sofort verfügbar ist (ICANON aus) und nicht erst nach Eingabe von Newline. Man kann dann mit select() schauen, ob überhaupt was Neues reingekommen ist und dann ggf. lesen.
    Allerdings muss man die Einstellungen am Ende des Programms wiederherstellen (muss man auch bei ncurses entsprechend).
    Unter der Haube macht ncurses wohl auch nix anderes, nur bietet es noch weit mehr Möglichkeiten. Spätestens wenn es um Farben geht ist es nahezu Pflicht, um die Unterschiede der unter Linux verwendeten Consolen wegzuwrappen.

    Zu Beginn des Programms:

    struct termios oldSettings;   // brauchen wir am Ende wieder
        tcgetattr( fileno(stdin), &oldSettings );
    
        struct termios newSettings( oldSettings );
        newSettings.c_lflag &= (~ICANON & ~ECHO);
        tcsetattr( fileno(stdin), TCSANOW, &newSettings );
    

    Am Ende des Programms:

    tcsetattr( fileno(stdin), TCSANOW, &oldSettings );
    

    Abfrage eines Zeichens:

    char getKey()
    {    
        struct timeval timeOut;
        timeOut.tv_sec =  0;
        timeOut.tv_usec = 0;
    
        fd_set set;
        FD_ZERO( &set );
        FD_SET( fileno(stdin), &set );
    
        if( select( fileno(stdin)+1, &set, NULL, NULL, &timeOut ) > 0 )
        {
            char c;
            if( 1 == read( fileno(stdin), static_cast<void*>(&c), sizeof(char) ))
            {
                return c;
            }
        }
    
        // Timeout, select- oder read-Error
        return '\0';
    }
    

Log in to reply