ncurses、print 和 contemporary 获取字符串

ncurses, print and contemporary acquire strings

用 C 编写的程序使用 ncurseswhile 循环用于连续检查队列中是否有新消息到达:如果是,则将消息打印在屏幕上,然后从队列中删除:

while (condition)
{
if (queue_not_empty)
{
printw(element_from_queue);
refresh();
remove(element_from_queue);
}
}

但同时,程序应该能够从用户那里获取输入的字符串,然后通过scanw将其存储在数组char message[100]中。 但是如果我把

while (condition)
{
if (queue_not_empty)
{
printw(element_from_queue);
refresh();
remove(element_from_queue);
}
scanw(message);
}

循环将停止,直到用户不键入字符串,程序将仅在 用户输入后打印队列中的新消息。不应该是这样的!队列消息可能随时到达并应打印出来;用户消息可能随时到达,应存储在数组中。

我想避免创建另一个线程,因为 ncurses 多线程变得很奇怪。无论如何,我需要两个 "contemporary" while 周期,一个用于打印消息,一个用于读取用户输入。

有解决办法吗?

换句话说:是否可以使用 ncurses 打印一些输出并在同一屏幕上从用户那里获得一些 多个字符 输入,在同一个线程中?

ncurses 提供了读取带有 timeout (or even no delay at all). Those are not useful with scanw 单个 字符的函数(它总是阻塞,等待 几个 字符) :

  • 使用超时时,getch returns ERR 而不是超时到期时的字符。
  • scanw内部可以使用getch,但是当getchreturnsERR.
  • 时没办法继续

而不是,您可以轮询输入。如果在给定的时间间隔内没有可用的字符,您的程序会(暂时)放弃,并做一些比等待字符更有用的事情。 轮询输入的应用程序可以编写为一次接受一个字符,将它们添加到缓冲区,直到用户按下 Enter,然后 then 运行 sscanf 在完成的文本上。

使用常规 C sscanf(从 string 读取)而不是直接从 screen 读取scanw.