2009-05-25 11 views
15

У меня возникают проблемы с получением ncurses 'getch() для блокировки. Работа по умолчанию кажется неблокирующей (или я пропустил какую-то инициализацию)? Я хотел бы, чтобы он работал как getch() в Windows. Я пробовал различные версииNon-blocking getch(), ncurses

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

(не все в то же время). Я предпочел бы (явно) использовать любые WINDOW, если это возможно. A while цикл вокруг getch(), проверка определенного возвращаемого значения также в порядке.

ответ

31

Библиотека curses представляет собой пакетную сделку. Вы не можете просто вытащить одну рутину и надеяться на лучшее, не инициализируя библиотеку. Вот код, который правильно блоки на getch():

#include <curses.h> 

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

Из (подчеркивание добавлено) a man page:

В timeout и wtimeout подпрограммы набор блокирования или неблокирующего чтения для данного окна. Если delay отрицательный, используется чтение с блокировкой (т. Е. ждет бесконечно для ввода).

+0

#include недействительным основной() { тайм-аут (-3000000); getch(); } не блокирует меня. Любые подсказки? –

+6

Предполагается, что вы используете остальные проклятия правильно, включая инициализацию. –

7

Вы должны вызвать initscr() или newterm() для инициализации ругательства, прежде чем он будет работать. Это отлично работает для меня:

#include <ncurses.h> 

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

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

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