2009-05-25 179 views
15

我有一些问题得到ncurses的getch()来阻止。默认操作似乎是非阻塞的(或者我错过了一些初始化)?我希望它能像Windows中的getch()一样工作。我曾尝试过各种版本的非阻塞getch(),ncurses

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

(并非全部在同一时间)。如果可能,我宁愿不(明确)使用任何WINDOW。一个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(强调):

timeoutwtimeout例程集阻塞和非阻塞读取 一个给定的窗口。 如果delay为负数,则使用阻止读取(即, 无限期地等待输入)。

+0

的#include 无效的主要() { 超时(-3000000); getch(); } 不会阻止我。任何线索? – 2009-05-25 01:55:56

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); 
}