【问题标题】:ncurses, print and contemporary acquire stringsncurses,打印和当代获取字符串
【发布时间】:2015-09-04 13:28:12
【问题描述】:

用 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 使用多个线程会变得很奇怪。无论如何,我需要两个“当代”while 循环,一个用于打印消息,一个用于读取用户输入。

有办法解决吗?

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

【问题讨论】:

    标签: c concurrency while-loop screen ncurses


    【解决方案1】:

    ncurses 提供了读取带有timeout(甚至是no delay)的单个 字符的函数。这些对scanw 没有用(它总是阻塞,等待几个字符):

    • 使用超时时,getch 在超时到期时返回 ERR 而不是字符。
    • scanw 可以在内部使用getch,但是当getch 返回ERR 时无法继续。

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

    使用常规的 C sscanf(从 string 读取)而不是使用 scanw 直接从 屏幕 读取。

    【讨论】:

    • 谢谢,但是我如何poll 输入以及应该使用哪些函数?
    • 链接指向timeoutnodelay(建议使用的函数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2017-10-05
    • 2018-07-06
    相关资源
    最近更新 更多