web-dev-qa-db-ja.com

非ブロッキングgetch()、ncurses

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

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

(同時にすべてではない)。可能であれば、WINDOWを(明示的に)使用しないことをお勧めします。 getch()の周りのwhileループ、特定の戻り値のチェックも問題ありません。

23
Jonas Byström

Cursesライブラリはパッケージ取引です。ライブラリを適切に初期化せずに、1つのルーチンを引き出して最高のものを期待することはできません。 getch()を正しくブロックするコードは次のとおりです。

#include <curses.h>

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

From man man page (強調を追加):

timeoutルーチンとwtimeoutルーチンは、特定のウィンドウに対して読み取りのブロックまたは非ブロックを設定します。 delayが負の場合、読み取りのブロックが使用されます(つまり、入力を無期限に待機します)。

9
Rob Kennedy

機能する前にcursesを初期化するには、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);
}
9
cjs