Qt中线程间通信的实现

2023-12-02

我在实现以下场景时遇到问题。我的问题陈述是这样的:

  1. 我有 3 个线程。 ThreadCamera 用于从相机中抓取帧。用于处理帧的 ThreadProcess(使用 OpenCV 对捕获的图像/帧进行一些图像处理)和用于显示图像的主 GUI 线程。
  2. 我不知道 ThreadProcess 处理图像需要多少时间。所以我想将图像从 ThreadCamera 传递到 ThreadProcess ,对图像进行一些图像处理并将其传递到主 GUI 线程进行显示。
  3. 当 ThreadProcess 处理图像时,T​​hreadCamera 应该休眠。 IE。它不应该从相机中抓取更多帧。当 ThreadProcess 完成图像处理任务时,它应该将图像和一些信息传递给主 GUI 线程。此后,只有 ThreadCamera 应该醒来并从该(ThreadCamera)线程中运行的相机中获取下一帧/图像。

感谢大家...在将相机和图像处理工作放在一个线程中的一些评论之后,我想知道另一点...这是...

  1. 如果在处理过程中不想让相机休眠怎么办?如果我丢失了 CameraThread 抓取的一些帧,对我来说并不重要(无论如何,如果我休眠或不休眠相机,我都会丢失)

我对每个进程(相机进程和图像处理作业)使用 QObject 并使用 movetoThread 命令使其在特定线程中运行。

任何有关实现和信号/槽设计的见解都会有所帮助。


您正在寻找的是一个简单的“发布/订阅”模式。在这种类型的“分发”模式中,当客户端不处于接收图像的状态时,所有消息都会被发送并由客户端丢弃

我将在您的应用程序中按如下方式实现:

像您已经做的那样,拥有所有单独的线程(相机、处理、Gui)。

让 CameraThread 定期(如果想简单的话可以通过 qTimer 信号)捕获图像并通过信号/槽连接将其发送到处理线程。

当处理线程正在处理图像时,它会设置一个状态标志(可以只是一个成员变量,bool 即可)来表示它当前正在处理图像。当你处理完图像后,你可以设置一个标志来表示你没有处理。

在处理线程槽中,它从 CameraThread 接收图像,您将首先检查当前是否正在处理图像。如果是,则无需对信号数据执行任何操作,只需返回即可。如果您不处理图像,您将存储信号数据并调用处理函数。

使这项工作有效的技巧是包括这个函数调用 (QCoreApplication::processEvents())在处理函数的ProcessingThreads主循环中。这将允许您的ProcessingThread在做一些有用的事情时处理它收到的任何信号。

状态变量检查将允许您在处理当前图像时“删除”发送给您的所有新图像,而不是将它们排队。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中线程间通信的实现 的相关文章

随机推荐

  • 如何使用OpenFeign获取pojo数组?

    我正在尝试使用 OpenFeign 客户端访问 API 获取一些 JSON 并将其转换为 POJO 数组 以前我只是简单地获取一串 JSON 并使用 Gson 将其转换为数组 如下所示 FeignInterface String get R
  • 如何在ASP.NET中实现实时更新

    我见过几个网站向您展示数据库中发生的情况的实时更新 一个例子可以是 实时显示股票价格的股票行情网站 显示诸如 其他用户当前正在搜索什么 之类的数据 我认为这将涉及某种轮询机制 每隔几秒钟查询数据库并将其呈现在网页上 但当我从性能的角度思考时
  • D3 生成的 LinearGradient 在 Firefox/IE 中不起作用

    我正在开发一个 D3 库 它将 D3 与 AngularJS 指令集成在一起 称为角D3 最近的指令之一允许生成可以绑定到数据并动态更新的梯度 这似乎适用于除 Firefox 之外的所有浏览器 但是 如果我将输出 SVG 复制 粘贴到 JS
  • 在 Dialogflow 中使用 NodeMailer

    我想发送一封电子邮件 要求在 Dialogflow 中制作的程序中进行操作 我想使用 NodeMailer 但是当我部署项目时 出现以下错误消息 您的云函数部署失败 函数加载错误 无法加载文件index js 中的代码 您是否列出了所有必需
  • Java SQL 时间戳到 ZonedDateTime

    我想将 ZonedDateTime 对象转换为 java sql Timestamp 对象 而不使用本地日期 例如 假设我有以下日期时间 System out println myZonedDateTime gt 2018 09 02T23
  • ASP.NET PostBack 选择树视图的复选框

    我有一个 asp net 项目并使用 C 工作 在我的项目中 我有一个带有复选框的数据绑定列表框 例如 当用户单击复选框时 它应该更新标签 文本框 问题是 它不会更新标签 文本框 直到我单击执行回发的按钮 我将如何调用复选框更改事件的回发
  • OpenGL 顶点数组对象存储顶点缓冲区名称和索引,还是仅存储索引?

    创建后 VAO 是否仅跟踪 VBO 索引 通过glBindVertexBuffer 或者哪些 VBO 名称与这些索引绑定 如果我使用指定绑定索引 例如 0glVertexAttribBinding在 VAO 创建期间 我可以在绘制调用之前将
  • 类型错误:列表索引必须是整数,而不是元组,出了什么问题[重复]

    这个问题在这里已经有答案了 Python 新手 求助 为什么我收到此错误 类型错误 列表索引必须是整数 而不是元组 imheight for i in range 0 len tables for j in range 0 len tabl
  • 匿名内部类中的接口如何工作?

    interface MyInter public void display class OuterClass8 public static void main String arg MyInter mi new MyInter public
  • 无法让 Django 提供静态文件

    我知道 SO 上有很多类似的线程 实际上有同样的问题 但我无法解决我的问题 Django版本 gt gt gt import django gt gt gt print django get version 1 6 2 我想从模板访问静态文
  • 如何将 jQuery 事件处理程序附加到 YouTube 电影?

    编辑 对那些已经回答的人表示抱歉 在我睡眠不足的状态下 我忘记了这种特殊情况是 YouTube 电影 而不是 JW FLV 播放器 我可以看到有更多关于与 YouTube 电影交互的文档 所以我会继续研究 但也欢迎提供更多信息 我正在使用
  • while 循环确定输入的值是否为 double

    我正在做一个相当大的项目 这只是包含在其中 基本上 我创建了一个获取员工信息的类 我们需要它 以便用户必须输入双倍的工资率 说 8 点 注意用户不能添加美元符号 例如 8 00 否则会提示用户发生错误 然而 当我测试运行代码时 代码没有使用
  • 如何格式化 Ansible 输出

    我想格式化 Ansible 输出 my local SUCCESS rc 0 gt gt 116G my local2 SUCCESS rc 0 gt gt 116G to my local gt gt 116G my local2 gt
  • 服务器如何因 chmod 777 而变得容易受到攻击?

    我经常读到类似这样的文章 chmod 777 很糟糕 我想知道 当我执行时我如何变得脆弱chmod 777在一个文件上 我可以重现的真实世界示例是什么 It 允许文件系统内容查看和 或修改由任何人 假设攻击者已经具有通用系统访问权限 这在共
  • 如何在Python中以指定位数的二进制字符串形式返回数字

    可能是一个愚蠢的问题 但是在 python 中是否有一种简单的方法可以自动用零将数字填充到固定长度 我在 python 文档中找不到这个 但我可能还不够努力 e i 我希望 bin 4 返回 00100 而不仅仅是 100 是否有一种简单的
  • 确定 WPF RichTextBox 中选定的 InlineUIContainer

    我想确定 WPF RichTextBox 中当前插入符位置是否存在 InlineUIContainer 或 BlockUIContainer 目前我有一个 RichTextBox 如下
  • Message内部逻辑

    我试图找出其中的逻辑Message行为 考虑评估以下内容 On Sin 1 1 评估完以上内容后 您将得到大约 830 Messages in 数学 7 所有这些Messages在生产过程中出现了 Sin argx Sin called w
  • 正则表达式 - 匹配后面没有特定模式的字符

    我想要一个正则表达式 尽可能高效 因为我使用 C 并且引擎效率不高 来匹配任何包含 且不立即跟随的字符串 1 一个字母 a zA Z or 2 NUMBERS a zA Z or 3 数字 a zA Z 所以我想匹配这样的字符串 dsfdf
  • C++ 中的 fseek 函数会刷新缓冲区中的数据吗?

    我们知道 调用 fprintf 或 fwrite 等函数不会立即将数据写入磁盘 而是会缓冲数据直到达到阈值 我的问题是 如果我调用 fseek 函数 这些缓冲数据会在查找新位置之前写入磁盘吗 或者数据仍在缓冲区中 并写入新位置 cheng
  • Qt中线程间通信的实现

    我在实现以下场景时遇到问题 我的问题陈述是这样的 我有 3 个线程 ThreadCamera 用于从相机中抓取帧 用于处理帧的 ThreadProcess 使用 OpenCV 对捕获的图像 帧进行一些图像处理 和用于显示图像的主 GUI 线