Non bloccante getch (), ncurses
Domanda
Sto avendo alcuni problemi a far getch ncurses' () per bloccare. Funzionamento di default sembra essere non bloccante (o mi sono perso un po 'di inizializzazione)? Vorrei farlo funzionare come getch () in Windows. Ho provato varie versioni di
timeout(3000000);
nocbreak();
cbreak();
noraw();
etc...
(non tutti allo stesso tempo). Preferirei non (esplicitamente) utilizzare a qualsiasi WINDOW
, se possibile. Un ciclo while
intorno getch (), il controllo per un valore di ritorno specifico è OK troppo.
Soluzione
La libreria curses è un pacchetto. Non si può semplicemente tirare fuori 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;
}
Altri suggerimenti
una pagina man (enfasi aggiunta):
Le routine
timeout
ewtimeout
set blocco o non bloccante per leggere una data finestra. Sedelay
è negativo, il blocco viene usata la lettura (cioè, attesa a tempo indeterminato per l'ingresso).
È necessario chiamare initscr()
o newterm()
per inizializzare maledizioni prima che funzionerà. Questo funziona bene 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);
}