我正在使用select
从套接字和STDIN进行非阻塞读取。在伪代码中:
loop
readable = select(socket, STDIN)
foreach input in readable
if input == STDIN
handle_keyboard_input(read(STDIN))
else
handle_socket_input(read(socket))
以上作品很棒。但是现在我想开始使用libncurses构建一个更复杂的基于文本的UI。 (我可能有两个窗口:一个大的日志窗口和一个较小的窗口用于提示。)
据推测,套接字处理将保持不变。但我不清楚libncurses如何抽象出STDIN。在libncurses窗口中进行非阻塞读取的正确习惯是什么?
实际上这是在Ruby中,但我只是在C API周围使用瘦包装器,所以我觉得这更适合标记为C问题。
答案 0 :(得分:2)
基本上,当您调用ncurses
等输入函数时,getch
仅从其输入流中读取。所以在这种程度上,ncurses
并没有抽象出任何东西;它所做的只是关联两个文件描述符,一个用于输入,一个用于输出,每个SCREEN
。有关详细信息,请参阅man newterm
。
如果您致电nodelay
或使用timeout/wtimeout
将超时设置为0,那么如果相应窗口没有待处理的输入,getch
将立即返回错误。这基本上只需要编写异步输入处理(就ncurses
而言。)如果你想使用select
循环,你需要处理调度后台任务的机制,等等ncurses
对多线程应用程序有基本的支持,如果你想走那条路。