跨 Qt 线程共享数据

2023-12-05

我是 Qt 的新手,所以请原谅问题的简单性,但我对 Qt 线程有点困惑。假设我有 3 个线程:主默认 GUI 线程和我自己创建的 2 个线程(称为 WorkerThread)。我的每个 WorkerThreads 都继承自 QThread,并且是永久线程,它们经常被唤醒并向套接字发送数据并在 GUI 元素上发布状态。 1) 允许 GUI 线程在 WorkerThread 线程可以使用的 WorkerThread 对象中设置数据的最佳方法是什么? 2)允许WorkerThread将状态发送到GUI线程以显示给用户? 3)允许两个WorkerThreads使用同一个socket?

从文档看来,当我创建一个 WorkerThread 对象时,它由创建线程拥有(除了作为新线程的 run 方法)。那么如何为新线程设置要执行的数据呢?新线程使用的所有数据都必须是全局的吗?例如,我希望 GUI 允许用户为每个 WorkerThread 选择在唤醒时发送的数据包类型。我假设我会在 WorkerThread 中放入一些由 GUI 线程发出信号的槽。当 WorkerThread 对象收到 SetPacketType 信号时,它将设置 run 方法在每次迭代时引用的成员变量。但在阅读文档后,我不确定这是否是正确的方法。如果 WorkerThread 对象由创建线程(在本例中为 GUI 线程)拥有,那么向它发送信号不会跨越线程边界,不是吗?

另外,跨线程共享套接字连接的正确技术是什么?

提前致谢。


对于 Qt,在线程之间发送信息的最简单方法是使用信号和槽。 Qt 自动使用排队信号进行线程之间的连接(请参阅Qt::连接类型),这确保了信号可以从一个线程发出,但槽将在接收者对象的线程中执行。

如果线程之间发送的数据(待完成的工作或状态信息)是 Qt 可以自动排队的数据(例如,QString、int 和 double 等内置类型),则将信息作为参数传递给信号/槽是发送信息的最佳方式。如果正在共享大型或复杂的数据,那么您需要使用qRegisterMetaType允许 Qt 复制数据,或传递指向线程安全对象的指针。与 Pie_Jesu 所说的不同,线程确实共享地址空间,因此您可以共享指针;只需确保一个线程与共享对象的交互不会干扰另一线程的交互。

QTcpSocket不是线程安全的(根据 Qt 的文档,它只是可重入的),因此如果您共享套接字,您将必须负责确保线程不会以冲突的方式使用套接字。

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

跨 Qt 线程共享数据 的相关文章

  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • QT:模块“QtWebView”未安装

    我的操作系统是win10 QT版本是Qt5 7 mingw53 32 目标操作系统是win10 当我使用qmlscene执行qml文件时 发生了一些错误 qrc qml 3 模块 QtWebView 未安装 我的 qml 文件如下 impo
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 为按钮控件 Qt Widgets 样式表定义多种样式

    如何在一个样式表中为一种控件定义多种样式 这样以后开发人员就可以选择控件应该是什么样子的样式 例如 我需要定义两种样式QPushButton 用于普通按钮 左侧 和操作按钮 右侧 对于第一个按钮 我编写了以下样式 QPushButton b
  • QML 圆规

    我目前正在创建一个虚拟仪表板 我想获得针后面的进度条类型 如以下链接所示 https forum qt io topic 89307 qml circular gauge styling needle trailing colour glo
  • 日历小部件的特定单元格如何着色?

    日历小部件的特定单元格如何着色 我认为你应该扩展 QCalendar 类并添加一些行为 我在这里找到了一些东西 http www qtforum org article 21614 paintcell and qcalendarwidget
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • PyQt:在运行时向滚动区域添加小部件

    我试图在运行时通过按下按钮来添加新的小部件 在下面的示例中我使用标签 这里是例子 import sys from PyQt4 QtCore import from PyQt4 QtGui import class Widget QWidge
  • 仅具有年/月视图的 PyQt 日历

    在 Qt Designer 中 QDateTimeEdit 具有日历视图选项 通过设置显示格式 我只能显示月 年 但是 当用户单击视图时 它会自动显示每日日历 有没有办法让它只显示月 年日历 为了形象地解释一下 Windows 日历具有与
  • Android 上的 QT 应用程序中的 java.nio.channels.OverlappingFileLockException

    我的 QT 应用程序崩溃了java nio channels OverlappingFileLockException例外Nokia 1具有以下调用堆栈的设备 FATAL EXCEPTION dbp processing com googl
  • 如何在 Qt4 OpenGL 应用程序中启用 HiDPI (Retina) 支持?

    我正在使用带有 QGraphicsView 的 QGraphicsScene 如中所述这个文件 https doc qt io archives qq qq26 openglcanvas html 我打算最终将 Qt 小部件覆盖在我的 Op
  • QImage 转换为 QML

    我的应用程序通过网络接收 JPEG 实时流 每秒 16 帧 直播流应使用 QML 显示 接收部分是用C 编写的 所有UI都是用QML编写的 如何将图像数据输入 QML 窗口 我已经研究过如何显示 QImage 但还没有找到解决方案 实现 Q
  • 如何释放Qthread对象的内存?

    我做过这样的事情 in the mainwindow s constructor QThread thr new QThread soundWorker work new soundWorker connect this SIGNAL pl
  • 无法在 Qt Creator 中检索调试输出

    在 Windows 上的 Qt Creator 中 qDebug 语句不起作用 并且输出窗口中出现以下消息 无法检索调试输出 如何解决 如果多个 Qt Creator 实例处于活动状态 则可能会出现此问题 要解决此问题 只需关闭 Qt Cr
  • 如何使用 C++ 更新 QML 文本

    我有一个小问题 有人可以告诉我如何从 C 更新 qml 文本吗 我有一个使用线程的示例 但我不想应用此方法 因为我不知道如何设置 run 函数中的参数 要完全理解我 这里是我的代码 在启动线程时的主函数中 我想放置自定义文本或具有文本的字符

随机推荐

  • Android:ListView,圆角问题

    我有带有圆角的 ListView 如下所示
  • 使用 AngularJS 和 Slim PHP 进行路由

    我一直在使用 AngularJS 并且正在尝试将我的应用程序连接到它 到目前为止 我已经使用了 Slim PHP 可以从 MySql 数据库中获取所有记录 但无法获取特定记录 我已经编写了 PHP 代码 可以导航到 requests 并获取
  • 如何将库导入到 NetBeans 中的 Java 项目?

    我需要一个可以使用 Double 或 Float 数字而不是 int 数字创建多边形的类 嗯 我找到了here and 这是Jar文件下载 我提取了 Jar 并将其添加到 NetBeans 中的库中 但现在 我不知道如何将包导入到我的项目中
  • Freemarker 编码 - 用问号代替重音字符

    我正在尝试使用 Freemarker 打印重音字符 但在重音字符的位置 我只得到问号 我已经证实 以下陈述成立 UTF 8 Environment getCurrentEnvironment getConfiguration getDefa
  • 具有多个 gitlab 用户帐户的多个密钥的 SSH 配置

    我在我的服务器上运行 Gitlab CE 并使用多个不同的用户帐户按兴趣对我的存储库进行分组 问题出在 SSH 上 我在github上找到了以下解决方案 https gist github com jexchan 2351996 在本指南中
  • 二叉搜索树递归插入不显示任何内容

    我正在对二叉搜索树进行小型 Java 工作 但是当我实现将节点递归插入到树中并显示它时 我什么也得不到 我已经研究了一段时间了 我不确定 但我认为这是一个传递引用的问题 这是我的代码 public class BST private BST
  • 如何在ios中迭代JSON对象

    我像这样创建 json 对象 id json NSJSONSerialization JSONObjectWithData data options kNilOptions error error 但文档没有告诉我如何循环json对象由键和
  • C - malloc 分配过多内存

    运行 int 一个奇怪的场景 其中 malloc 分配的内存比我要求的多 void function int array int numberOfElements int secondArray malloc sizeof int numb
  • Servlet 过滤器:非常简单的限速过滤器,允许突发

    我想添加一个非常简单的过滤器 对每个 IP 进行速率限制 但仍然允许突发 有点像iptables允许做 我不想安装整个厨房水槽 我需要的只是一个实现该功能的 Filter 类 什么是允许执行简单的 速率限制但允许短突发 的良好数据结构 算法
  • RegSvr32.exe 的 /n 和 /i 参数有什么不同?

    要注册 COM 服务器 我们在提升模式下运行类似的命令 regsvr32 exe com dll 要执行每用户注册 请在用户帐户中执行 regsvr32 exe n i user com dll regsvr32 exe 支持以下参数 u
  • 在 Python 日志记录中跨多个模块访问记录器

    我有一个关于 python 日志记录模块的小问题 我有一个简单的记录器 记录器 basicConfig 如何使用 getLogger 访问同一个记录器 或者 getLogger 是否为我提供了一个我可以访问的日志记录对象 如果是这样 我如何
  • 在Python中比较整数中的数字

    这里确实需要一些帮助 学习 Python 的超级早 目标是获取一个数字并查看数字是否按升序排列 到目前为止我所拥有的是 a int input Enter a 4 digit number b int i for i in str a if
  • 转换日期格式 yyyy-MM-dd'T'HH:mm:ss.SSS

    我有几个NSDate包含符合此格式的值的对象yyy MM dd T HH mm ss SSS 当我尝试转换为不同的格式时 例如MMM dd yyyy HH mm格式化程序总是返回nil 但是 如果我对字符串值进行硬编码 我将通过NSDate
  • Moq 模拟和跟踪会话值

    我在使用 Moq 进行模拟返回会话值集时遇到问题 使用以下内容 public class TestHelpers public long sessionValue 1 public HttpContextBase FakeHttpConte
  • 我的网页周围的 CSS 边框

    我目前在网站周围定位边框时遇到一些问题 我目前正在托管该网站here 我想要一个黄色边框围绕身体 但距离边缘大约 20 30 像素 我还希望边框具有响应能力 因此当我调整浏览器大小时 边框也会跟随 我尝试过的所有方法都不起作用 有人知道我需
  • 检查目标 c 中的字符串是否为回文

    我正在尝试检查字符串是否是回文或不使用 Objective C 我是编程新手 没有任何其他编程语言的经验 所以请耐心等待 我陷入了 if 条件 我想让它说 如果字符串中的第一个位置等于最后一个位置 则字符串是回文 我究竟做错了什么 int
  • 如何将 SOAP 响应转换为 PHP 数组?

    我无法将 SOAP 响应转换为 php 中的数组 这是代码 response client gt doRequest xmlRequest location action 1 这是 SOAP 响应
  • Boost DFS如何保存访问过的顶点?

    我正在看解决方案here 这对我不起作用 但在 行下阅读以实际查看当前问题 I tried boost undirected dfs G vertex 0 G boost visitor vis 但我得到 error C2780 void
  • 出现错误无法解析对程序集 System.Web 的依赖关系

    我不得不更换我的主硬盘 昨天我的 HD 被我们的 IT 技术人员更换了 所以今天 在安装 VS 2015 后 我开始开发我们一直在开发的 WPF 应用程序 我进入了该项目 从 TFS 获取最新信息并进行了构建 我失败并出现以下错误 无法解析
  • 跨 Qt 线程共享数据

    我是 Qt 的新手 所以请原谅问题的简单性 但我对 Qt 线程有点困惑 假设我有 3 个线程 主默认 GUI 线程和我自己创建的 2 个线程 称为 WorkerThread 我的每个 WorkerThreads 都继承自 QThread 并