2009-05-25 14 views
15

Je rencontre des problèmes pour bloquer ncurses 'getch(). L'opération par défaut semble être non-bloquante (ou ai-je manqué une initialisation)? Je voudrais qu'il fonctionne comme getch() dans Windows. J'ai essayé différentes versions deGetch(), non bloquant, ncurses

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

(pas tous en même temps). Je préférerais ne pas (explicitement) utiliser WINDOW, si possible. Une boucle while autour de getch(), la vérification d'une valeur de retour spécifique est également OK.

Répondre

31

La bibliothèque curses est un package. Vous ne pouvez pas simplement sortir une routine et espérer le meilleur sans initialiser correctement la bibliothèque. Voici un code qui correctement des blocs sur getch():

#include <curses.h> 

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

De a man page (italique ajouté):

Les timeout et wtimeout un ensemble de routines blocage ou non-bloquante pour une fenêtre donnée. Si delay est négatif, la lecture bloquante est utilisée (c'est-à-dire que attend indéfiniment l'entrée).

+0

#include void main() { délai d'attente (-3.000.000); getch(); } ne bloque pas pour moi. Des indices? –

+6

Il est supposé que vous utilisez correctement le reste des malédictions, y compris l'initialisation. –

7

Vous devez appeler initscr() ou newterm() pour initialiser malédictions avant qu'elle ne fonctionnera. Cela fonctionne très bien pour moi:

#include <ncurses.h> 

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

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

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