while(1)... Tastatur abfragen ohne zu blockieren
-
Hi,
while( true ) { /*Zeug was zu tun ist...*/ c = getchar(); if( c == 3 ) break; }
Die while loop wird "zweimal" unter Linux ausgeführt (wahrscheinlich sähe das auch unter Windows so aus)
Ich möchte die loop solange ausführen bis ich z.B. Ctrl-C drücke oder eine beliebige andere Taste. Die Tastaturabfrage darf nur nicht blockieren.
Franky
-
Mit ANSI C ist das nicht möglich. Daher verschiebe ich dich mal in das Linux-Forum. Mit der Funktion getch aus der FAQ geht das ganze: http://c-plusplus.net/forum/viewtopic-var-t-is-39509.html
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hi,
wenn ich die getch von http://c-plusplus.net/forum/viewtopic-var-t-is-39509.html nehmen blockt das ganze.
Gruß
-
Dann schau entweder mit kbhit (aus der FAQ) vorher ob ein Zeichen da ist, oder modifiziere das ganze ein bisschen
int getch_nonblock(void) { struct termios term, oterm; int fd = 0; int c = 0; tcgetattr(fd, &oterm); memcpy(&term, &oterm, sizeof(term)); term.c_lflag = term.c_lflag & (!ICANON); term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 1; tcsetattr(fd, TCSANOW, &term); c = getchar(); tcsetattr(fd, TCSANOW, &oterm); return c; // gibt -1 zurück, wenn kein Zeichen gelesen wurde }
-
hi rüdiger,
dein Code sieht sehr interessant aus.
Könntest du vielleicht den Code etwas Kommentieren ^^ ?
-
Ich hab einfach den Code aus der FAQ übernommen. Aber wenn du eine kleine Erklärung willst: Mit man: tcsetattr kann man das Low Level Terminal Interface einstellen.
!ICANON bedeutet, dass das Terminal im nicht-Canonicalmode betrieben werden soll (also nicht Zeilenweise, wie das bei den Terminalfunktionen sonst üblich ist). c_cc[VMIN] ist die Anzahl an bytes die mindestens gelesen werden soll und c_cc[VTIME] ist die Anzahl an 1/10s die auf Eingabe gewartet werden soll: http://www.gnu.org/s/libc/manual/html_node/Noncanonical-Input.html
-
Hi,
/* * Ein Terminal ist über serielle Schnittstellen mit Linux-Rechnern * verbunden. Lokal existiert natürlich keine Kommunikation über * eine Scnittstelle. * Ein- und Ausgaben sind in der Standardeinstellung immer Zeilengepuffert. * Zeilengepuufert bedeutet, sobald Enter gerückt wird read beendet. * * Terminalerklärung....: * http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel6.shtml */ int kbhit(void) { struct termios oldt, newt; int ch; int oldf; //Attribute holen tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); //Echo und zeilenweise... auschalten //neue Attribute setzen tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); //blockieren abschalten ch = getchar(); //Zeichen holen //alte Attribute setzen tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if(ch != EOF) { ungetc(ch, stdin); return 1; } return 0; }
Nu geht's.
Franky
-
Solltest du deine Funktion nicht besser anders nennen, um nicht irgendwann mit kbhit() aus conio.h zu kollidieren?
-
Hi,
jupp! ...
int kbhit_non_blocking(void).
Gruß