2009-05-25 204 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); 
}