代码之家  ›  专栏  ›  技术社区  ›  Cyker

ncurses多线程读写解决方案

  •  1
  • Cyker  · 技术社区  · 7 年前

    这就是上面说的 http://invisible-island.net/ncurses/ncurses.faq.html#multithread

    如果您有一个程序在多个线程中使用curses,那么您几乎肯定会看到奇怪的行为。这是因为诅咒依赖于输入和输出的静态变量。使用一个线程作为输入,使用其他线程作为输出不能解决问题,额外的屏幕更新也不能帮助解决问题。本FAQ不是关于线程编程的教程。

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

    我之所以问这个问题,是因为我注意到一个真正的应用程序通常有自己的事件循环,但依赖于ncurse getch 函数获取键盘输入。但是如果主线程在自己的事件循环中被阻塞等待,那么它就没有机会调用 格奇 . 一个看似可行的解决方案是 格奇 在另一个线程中,这还没有引起我的问题,但正如上面所说的,实际上是不安全的,并且被另一个用户验证了 here . 所以我想知道什么是最好的合并方式 格奇 进入应用程序自己的事件循环。

    我正在考虑 格奇 不阻塞并定期唤醒主线程(每10-100毫秒)以检查是否有要读取的内容。但这会在关键事件之间增加额外的延迟,从而降低应用程序的响应速度。另外,我不确定这是否会导致一些NCURES内部延迟的问题,例如 ESCDELAY .

    我正在考虑的另一个解决方案是直接轮询stdin。但我想努尔斯也应该做些类似的事情,从两个不同的地方读同一篇文章看起来很糟糕。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Thomas Dickey    7 年前

    如果没有线程支持,那么在多个线程中使用curses函数就不走运了。这是因为大多数诅咒调用都使用静态或全局数据。这个 getch 函数,例如调用 refresh 它可以使用全局指针更新整个屏幕 curscr 和 stdscr . 线程支持配置的不同之处在于,全局值被转换为函数并添加互斥体。

    如果你想读书 斯坦丁 从不同的线程运行 诅咒 在一个线程中,您可能可以通过检查 文件描述符 (即, 0 )用于挂起的活动,并警告运行curses的线程告诉它读取数据。