2009-05-25 24 views
15

ncursesのgetch()をブロックするのに問題があります。デフォルトの操作はノンブロッキング(または私はいくつかの初期化が欠けている)のようですか? Windowsでgetch()のように動作させたいです。私はさまざまなバージョンの試してみました。ノンブロッキングgetch()、ncurses

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

(すべてではありません)可能であれば、私は(明示的に)WINDOWを使用しないことをお勧めします。 A while getch()の回りでループすると、特定の戻り値をチェックすることもOKです。 a man pageから

答えて

31

cursesライブラリはパッケージ契約です。ライブラリを適切に初期化せずに、最良のものを1つのルーチンとして引き出すことはできません。ここでは、コードだと正しくgetch()上のブロック:

#include <curses.h> 

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

(強調追加):

timeoutwtimeoutルーチンは、ブロッキングまたは 所与のウィンドウの読み取り非ブロックセット。 delayが負の場合、ブロッキング読み出しが使用されます(つまり、 は入力を無限に待機します)。

+0

の#include 無効メイン(){ タイムアウト(-3000000)。 getch(); } は私をブロックしません。すべての手がかりは? –

+6

初期化を含め、残りのcursesを適切に使用していると仮定します。 –

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