2009-05-25 18 views
15

Sto riscontrando qualche problema nel bloccare getch() di ncurses. L'operazione di default sembra essere non bloccante (o mi sono perso un'inizializzazione)? Mi piacerebbe che funzionasse come getch() in Windows. Ho provato varie versioni digetch non bloccante(), ncurses

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

(non tutte alla stessa ora). Preferirei non utilizzare (esplicitamente) qualsiasi WINDOW, se possibile. Un ciclosu getch(), il controllo di un valore di ritorno specifico è OK.

risposta

31

La libreria di curses è un pacchetto. Non puoi semplicemente estrarre una routine e sperare per il meglio senza inizializzare correttamente la libreria. Ecco un codice che correttamente blocchi sulla getch():

#include <curses.h> 

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

Da a man page (enfasi aggiunta):

I timeout e wtimeout routine set blocco o non bloccante per leggere una data finestra. Se delay è negativo, viene utilizzata la lettura di blocco (ad esempio, attende indefinitamente per l'input).

+0

#include void main() { timeout (-3.000.000); getch(); } non blocca per me. Qualche indizio? –

+6

Si presume che tu stia utilizzando correttamente il resto dei curses, inclusa l'inizializzazione. –

7

è necessario chiamare o initscr()newterm() per inizializzare maledizioni prima che funzionerà. Questo funziona per me:

#include <ncurses.h> 

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

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

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