这就是上面所说的http://invisible-island.net/ncurses/ncurses.faq.html#multithreads http://invisible-island.net/ncurses/ncurses.faq.html#multithread
如果您的程序在多个线程中使用诅咒,您几乎肯定会看到奇怪的行为。这是因为curses 依赖于输入和输出的静态变量。使用一个线程进行输入,使用其他线程进行输出并不能解决问题,额外的屏幕更新也无济于事。此常见问题解答不是有关线程编程的教程。
具体来说,它提到即使输入和输出在单独的线程上完成也是不安全的。如果我们进一步对整个 ncurses 库使用互斥体,以便一次最多有一个线程可以调用任何 ncurses 函数,这样会安全吗?如果没有,在多线程应用程序中安全使用 ncurses 的其他廉价解决方法是什么?
我问这个问题是因为我注意到真实的应用程序通常有自己的事件循环但依赖于 ncursesgetch
获取键盘输入的函数。但是如果主线程在自己的事件循环中阻塞等待,那么它就没有机会调用getch
。一个看似适用的解决方案是调用getch
在不同的线程中,这还没有给我带来问题,但正如上面所说的实际上不安全,并且已由另一个用户验证here https://www.allegro.cc/forums/thread/529037。所以我想知道合并的最佳方式是什么getch
进入应用程序自己的事件循环。
我正在考虑制作getch
非阻塞并定期(每 10-100 毫秒)唤醒主线程以检查是否有内容要读取。但这会增加关键事件之间的额外延迟,并使应用程序的响应速度降低。另外,我不确定这是否会导致某些 ncurses 内部延迟的问题,例如ESCDELAY
.
我正在考虑的另一个解决方案是直接轮询标准输入。但我想 ncurses 也应该做类似的事情,从两个不同的地方读取相同的流看起来很糟糕。
文本还提到了“ncursest”或“ncursestw”库,但它们似乎不太可用,例如,如果您使用不同的诅咒语言绑定。如果标准 ncurses 库有一个可行的解决方案,那就太好了。
如果没有线程支持,您将无法在多个线程中使用curses 函数。这是因为大多数诅咒调用都使用静态或全局数据。这getch
实例调用的函数refresh
它可以更新整个屏幕——使用全局指针curscr
and stdscr
。线程支持配置的区别在于全局值被转换为函数并添加了互斥体。
如果你想阅读stdin从不同的线程并运行curses在一个线程中,您可能可以通过检查文件描述符 (i.e., 0
)用于挂起的活动并提醒运行curses的线程告诉它读取数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)