2009-05-25 13 views
15

Ich habe einige Probleme mit ncurses' getch() immer zu blockieren. Die Standardoperation scheint nicht blockierend zu sein (oder habe ich eine Initialisierung verpasst)? Ich möchte, dass es wie getch() in Windows funktioniert. Ich habe verschiedene Versionen vonNon-blocking getch(), ncurses

timeout(3000000); 
nocbreak(); 
cbreak(); 
noraw(); 
etc... 

(nicht alle zur gleichen Zeit) ausprobiert. Ich würde es vorziehen, nicht (explizit) WINDOW zu verwenden, wenn möglich. A while Schleife um getch(), Überprüfung auf einen bestimmten Rückgabewert ist auch OK.

Antwort

31

Die Curses-Bibliothek ist ein Pauschalangebot. Sie können nicht einfach eine Routine herausziehen und auf das Beste hoffen, ohne die Bibliothek richtig zu initialisieren. Hier ist ein Code, der richtig Blöcke auf getch():

#include <curses.h> 

int main(void) { 
    initscr(); 
    timeout(-1); 
    int c = getch(); 
    endwin(); 
    printf ("%d %c\n", c, c); 
    return 0; 
} 
6

Von a man page (Hervorhebung hinzugefügt):

Die timeout und wtimeout Routinen Satz blockiert oder nicht-blockierenden für ein bestimmtes Fenster lesen. Wenn delay negativ ist, blockiert Lese verwendet (d.h. wartet auf unbestimmte Zeit für die Eingabe).

+0

#include void main() { Timeout (-3000000); getch(); } blockiert nicht für mich. Irgendwelche Hinweise? –

+6

Es wird angenommen, dass Sie den Rest der Flüche richtig verwenden, einschließlich der Initialisierung. –

7

Sie müssen initscr() oder newterm() nennen Flüche zu initialisieren, bevor es funktionieren wird. Das funktioniert gut für mich:

#include <ncurses.h> 

int main() { 
    WINDOW *w; 
    char c; 

    w = initscr(); 
    timeout(3000); 
    c = getch(); 
    endwin(); 

    printf("received %c (%d)\n", c, (int) c); 
}