ncurses,print和contemporary获取字符串
用C编写的程序使用ncurses
。 while
循环用于连续检查队列中是否有新消息到达:如果是,则消息将打印在屏幕上,然后从队列中删除:
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
对多个线程变得奇怪。 无论如何,我需要两个“当代”循环,一个用于打印消息,一个用于读取用户输入。
可能有解决方案吗?
换句话说:是否可以使用ncurses
打印一些输出并从同一个屏幕中的同一个线程中的用户输入一些多个字符 ?
ncurses提供了使用超时读取单个字符的function(甚至根本没有延迟 )。 这些对于scanw
(总是阻塞,等待几个字符)没有用处:
- 当使用超时时,
getch
在超时到期时返回ERR
而不是字符。 -
scanw
可以在内部使用getch
,但是当getch
返回ERR
时无法继续。
您可以轮询输入,而不是阻止 。 如果在给定的时间间隔内没有可用的字符,则程序会放弃(暂时),并且比等待字符更有用。 可以编写轮询输入的应用程序,一次接受一个字符,将它们添加到缓冲区,直到用户按Enter键 , 然后对完成的文本运行sscanf
。
使用常规C sscanf
(从字符串中读取)而不是使用scanw
直接从屏幕上scanw
。