Ncursesのgetch()がブロックするのに問題があります。デフォルトの操作は非ブロッキングであるように見えますか(またはいくつかの初期化に失敗しました)? Windowsでgetch()のように動作させたい。私はさまざまなバージョンを試しました
timeout(3000000);
nocbreak();
cbreak();
noraw();
etc...
(同時にすべてではない)。可能であれば、WINDOW
を(明示的に)使用しないことをお勧めします。 getch()の周りのwhile
ループ、特定の戻り値のチェックも問題ありません。
Cursesライブラリはパッケージ取引です。ライブラリを適切に初期化せずに、1つのルーチンを引き出して最高のものを期待することはできません。 getch()
を正しくブロックするコードは次のとおりです。
#include <curses.h>
int main(void) {
initscr();
timeout(-1);
int c = getch();
endwin();
printf ("%d %c\n", c, c);
return 0;
}
From man man page (強調を追加):
timeout
ルーチンとwtimeout
ルーチンは、特定のウィンドウに対して読み取りのブロックまたは非ブロックを設定します。delay
が負の場合、読み取りのブロックが使用されます(つまり、入力を無期限に待機します)。
機能する前に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);
}