2009-05-25 22 views
15

Tengo algunos problemas para obtener el bloqueo de ncurses getch(). La operación predeterminada parece ser no bloqueante (¿o he perdido alguna inicialización)? Me gustaría que funcione como getch() en Windows. He intentado varias versiones degetch sin bloqueo(), ncurses

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

(no todas al mismo tiempo). Preferiría no (explícitamente) usar WINDOW, si es posible. Un while loop alrededor de getch(), también está bien verificar un valor de retorno específico.

Respuesta

31

La biblioteca de curses es un paquete. No puede simplemente sacar una rutina y esperar lo mejor sin inicializar adecuadamente la biblioteca. Aquí hay un código que correctamente bloques en 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 (énfasis añadido):

Los timeout y wtimeout rutinas establecidas bloqueo o no bloqueo de lectura por una ventana determinada. Si delay es negativo, se usa lectura de bloqueo (es decir, espera indefinidamente para la entrada).

+0

# include void main() { tiempo de espera (-3.000.000); getch(); } no bloquea para mí. ¿Alguna pista? –

+6

Se supone que está utilizando el resto de las maldiciones correctamente, incluida la inicialización. –

7

es necesario llamar a initscr() o newterm() para inicializar maldiciones antes de que funcione. Esto funciona bien para mí:

#include <ncurses.h> 

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

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

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