ncurses 多线程读写的解决方法

2024-01-20

这就是上面所说的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(使用前将#替换为@)

ncurses 多线程读写的解决方法 的相关文章

  • 如何在.NET 中编写安全/正确的多线程代码?

    今天我必须修复一些使用线程的旧 VB NET 1 0 代码 问题在于从工作线程而不是 UI 线程更新 UI 元素 我花了一些时间才发现可以使用 InvokeRequired 断言来查找问题 除了上面提到的并发修改问题之外 还可能遇到死锁 竞
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • 线程自身连接

    我很怀疑 当线程加入自身时会发生什么 即线程自行调用 join 方法 我没有收到任何错误 样本 public class JoinItself extends Thread public void run System out printl
  • 单线程程序中可以有竞争条件吗?

    您可以在here https en wikipedia org wiki Race condition Software关于什么是竞争条件的一个很好的解释 我最近看到很多人对竞争条件和线程做出了令人困惑的陈述 我了解到竞争条件只能发生在线程
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 断点会停止所有线程吗?

    如果我的程序中有两个线程同时运行 并在其中一个线程上设置了断点 那么当遇到此断点时 另一个线程也会停止 还是会继续执行 我用 Java 编写并使用 NetBeans 断点可以选择它们的行为方式 挂起单个线程或所有线程
  • 除非在后台线程中获取新的引用,否则存在潜在的引用计数问题

    我有一个second https stackoverflow com questions 28898966 prefer property accessor or kvc style for accessing core data prop
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • 在 Python 中打印守护线程异常

    Python 不会打印守护线程中引发的异常的回溯消息 例如 以下代码创建一个守护线程并在新线程中引发异常 def error raiser raise Exception import threading thread threading
  • 如何停止提交给 ExecutorService 的 Callable?

    我正在尝试实现一个示例应用程序来测试Callable and ExecutorService接口 在我的应用程序中我已经声明 ExecutorService exSvc Executors newSingleThreadExecutor T
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 如何在Spring-Boot中创建DefaultMessageListenerContainer?

    我是 Spring Boot 的新手 并尝试创建 DefaultMessageListenerContainer 以便我可以使用 weblogic workmanager 并以多线程方式运行多个消息侦听器 有人可以提供一些例子吗 到目前为止
  • 这是 C# 的有效、惰性、线程安全的 Singleton 实现吗?

    我实现了这样的单例模式 public sealed class MyClass public static MyClass Instance get return SingletonHolder instance static class
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 在 C# 中创建加密随机数的最快、线程安全的方法?

    请注意 在多个线程上并行生成随机数时 加密随机数生成器不是线程安全的 使用的发电机是RNGCryptoServiceProvider它似乎重复了很长一段随机位 128 位 重现此情况的代码如下所示 缺乏使用锁来保护访问RNGCryptoSe

随机推荐

  • 如何避免 Jenkins 多分支管道作业自行触发

    我希望我的 Jenkins 多分支管道作业能够避免自行触发 该作业进行提交 因为它会增加版本文件并将其签入源代码管理 这会导致无限循环 在正常工作中我可以遵循这些说明 https liviutudor com 2015 12 09 jenk
  • Android实时数据库抛出错误:客户端已离线但实际上并没有

    该应用程序执行简单的注册 使用 FirebaseAuth FirebaseUI 和 Google Sign In 认证时成功地 我拿firebaseUser userId并使用它从实时数据库中获取用户配置文件 示例位置 users user
  • 使用 TFS 2010“构建”经典 ASP

    我使用 TFS 2010 进行源代码控制和持续集成 除其他外 我有一个我维护的经典 ASP 应用程序 我想将其合并到持续集成构建中 但是 我必须在构建定义中提供 要构建的项目 由于经典 ASP 没有与之关联的解决方案或项目 因此我仍然可以使
  • Struts2 ValueStack如何处理多个请求

    我明白ValueStack在 Struts2 中引入 Struts1 模型的另一项变化现在是一个新的ActionObject为每个请求实例化 所以我们可以定义实例变量而不用担心多线程问题 拦截器和 JSP 访问实例变量的方式ActionOb
  • 如何抑制 ggplot2 图中的垂直网格线?

    我正在构建一个条形图 其中条形足以作为水平 x 放置的指示 因此我想避免绘制多余的垂直网格线 我了解如何在 opts 中设置次要和主要网格线的样式 但我一生都无法弄清楚如何仅抑制垂直网格线 library ggplot2 data lt d
  • Xamarin.Android - 本机代码编译是否会使逆向工程变得更加困难?

    我们正在考虑将 C NET 应用程序移植到 Android 我已经开始阅读有关 Xamarin Android 和 Mono 框架的内容 我刚刚开始Android 开发 我注意到主要http xamarin com android http
  • 在 Scikit-learn 中使用 Smote 和 Gridsearchcv

    我正在处理不平衡的数据集 并希望使用 scikit 的 gridsearchcv 进行网格搜索来调整模型的参数 为了对数据进行过采样 我想使用 SMOTE 并且我知道我可以将其作为管道的一个阶段并将其传递给 gridsearchcv 我担心
  • 当“下拉菜单值更改”时重新加载 d3 图表

    当用户在下拉菜单中选择一个项目以及与该项目对应的数据时 我试图重新加载 d3 js 折线图 我的菜单是股票市场价值列表 YHOO FB 对于其中每一个 我都有一个包含数据的 JSON 文件 该图本身正在发挥作用 我将代码放在 JSFiddl
  • 在 Active Admin 中禁用 CSV 下载

    我正在使用 Active Admin gem 我想隐藏或删除每个模型索引页面上的链接 允许用户下载 CSV XML 或 JSON 格式的数据 有什么办法可以做到这一点吗 现在有一个选项 download links在索引方法上 因此您可以根
  • 测试用例中缺少 ROLLBACK 会导致多数据库 django 应用程序中唯一约束冲突

    我刚刚开始使用工厂男孩 https github com dnerdy factory boy用于测试工厂的 django 库 并且存在重复键约束违规问题 测试成员程序 py from datetime import date timede
  • 如何从 aws 实例内部检测其状态?

    我在 EC2 中有自动缩放组 我想在实例终止时检测实例的状态 以便我可以在实例终止之前开始导出日志文件 我知道实现此目的的一种方法是使用自动缩放生命周期挂钩 但根据我的理解 我必须使用外部监视器 然后该监视器必须 ssh 到实例并导出日志文
  • 从 select 语句 mysql 调用用户定义的存储过程

    我试图从 select 语句调用用户定义的存储过程 但它给了我一个错误 但是 当我调用系统过程时 它工作得很好 有没有办法从 select 语句调用用户定义的过程 这是针对mysql的 SELECT ID email FROM user P
  • 在nodejs日期对象中设置日期将日期显示为不同的值

    当我使用下面的语句设置日期对象时 输出在 NodeJS 中显示不同 你能帮我理解为什么会这样吗 以及我需要如何传递来打印正确的值 var date1 new Date 2017 01 01 var date2 new Date 2017 0
  • Charts.js 直线 - 我找不到解决方案

    所以我使用charts jshttp www chartjs org http www chartjs org 我试图使两个点之间的线是直的而不是弯曲的 没有明显的原因 现在看起来像那样https i stack imgur com rK8
  • 我是否应该使用“self”来定义我不需要从外部访问的实例化类的变量/对象?

    我不是一个完全的初学者 但相当陌生Python 今天在做一个项目时 我只是有一个想法 并想知道 self 我过去读过一段时间 但我仍然无法弄清楚它是否总是必要的 我的问题仅涉及类的实例和实例参数 变量 这个问题与影响所有实例的类变量无关 E
  • 更新复杂 JTable、TableModel 等的正确方法

    我的 GUI 显示了我的车辆park 以及我想要设置的车辆可用的在两个不同的车辆表 扩展 JTable 的类 对于可用的情况 我希望可以从agent 第三方软件 这两个表都显示了行中车辆的描述 为此我创建了车辆表模型 and Vehicle
  • 使用 yum 安装 pgAdmin4

    是否已经有一种方法可以安装 pgAdmin IV Beta 桌面运行时 例如与百胜 我在官网上找到了Python Wheel的下载链接 但是没有yum的提示 桌面运行时似乎还没有可用 pgAdmin 4 已包含在官方中PostgreSQL
  • 更改购物车列的顺序而不覆盖 Woocommerce 中的模板文件

    是否有解决方案可以更改购物车列的顺序 而无需将文件复制到我自己的模板文件夹中 原因是 我不想覆盖这么重要的模板文件 不幸的是 订单被硬编码为文件中的表格cart php并且不在函数内部 在这种情况下 是否有任何 干净 的方法来更改列的顺序
  • 如何使用带有可选提示的expect?

    假设我正在尝试为具有三个提示的 test sh 编写一个 Expect 脚本 prompt1 prompt2 prompt3 我的代码是这样的 spawn test sh expect prompt1 send pass1 expect p
  • ncurses 多线程读写的解决方法

    这就是上面所说的http invisible island net ncurses ncurses faq html multithreads http invisible island net ncurses ncurses faq ht