ncurses多线程读写的解决方法

时间:2018-12-17 05:15:08

标签: multithreading ncurses curses

这是http://invisible-island.net/ncurses/ncurses.faq.html#multithread

上的内容
  

如果您有一个程序在多个线程中使用curses,则几乎可以肯定会看到奇怪的行为。这是因为curses依赖于静态变量的输入和输出。使用一个线程进行输入而其他线程进行输出无法解决该问题,也无法提供额外的屏幕更新帮助。此常见问题解答不是有关线程编程的教程。

具体地说,它提到即使输入和输出在单独的线程上完成也不安全。如果我们在整个ncurses库中进一步使用互斥锁,这样一个线程最多一次可以调用任何ncurses函数,这是否安全?如果不是,那么在多线程应用程序中安全使用ncurses的其他廉价解决方法是什么?

我之所以问这个问题,是因为我注意到一个真实的应用程序通常具有其自己的事件循环,但是依靠ncurses getch函数来获取键盘输入。但是,如果主线程在其自己的事件循环中处于等待块状态,则它没有机会调用getch。一个看似适用的解决方案是在另一个线程中调用getch,这尚未引起我任何问题,但是正如上面所说的,这实际上并不安全,并且已由另一个用户here进行了验证。因此,我想知道将getch合并到应用程序自己的事件循环中的最佳方法是什么。

我正在考虑使getch处于非阻塞状态,并定期(每10-100毫秒)唤醒主线程,以检查是否有需要读取的内容。但这在关键事件之间增加了额外的延迟,并使应用程序的响应速度降低。另外,我不确定这是否会引起某些内部延迟,例如ESCDELAY

我正在考虑的另一种解决方案是直接轮询stdin。但是我想ncurses也应该做这样的事情,并且从两个不同的地方读取相同的流看起来很糟糕。

文本还提到了“ ncursest”或“ ncursestw”库,但是它们似乎不那么可用,例如,如果您使用的是curses的不同语言绑定。如果标准ncurses库有可行的解决方案,那就太好了。

1 个答案:

答案 0 :(得分:1)

在没有线程支持的情况下,您无法在多个线程中使用curses函数。这是因为大多数curses调用都使用静态或全局数据。例如,getch函数调用refresh可以使用全局指针 curscr stdscr 来更新整个屏幕>。线程支持配置的不同之处在于,将全局值转换为函数,并添加了互斥锁。

如果您想从另一个线程中读取 stdin 并在一个线程中运行 curses ,则可以通过检查 文件来使其正常工作描述符 (即, 0 ),以提醒未决的活动,并提醒运行curses的线程告诉其读取数据。

相关问题