如何避免 Qt app.exec() 阻塞主线程

2023-11-30

我是 Qt 新手,但需要解决一个难题。

我创建了一个非常简单的 GUI,我需要将其添加到现有的 C++ 应用程序中。问题是,我只编写了一个插入更大架构的模块,这限制了我对主线程的访问。

我的代码必须驻留在以下四个函数中: Init() 函数,在主线程中运行。 以及在工作线程中运行的 WorkerStart()、WorkerStep() 和 WorkerStop() 函数。

我在 Init() 函数中编写了 QApplication 和 GUI 对象。当然,在该函数末尾调用 app.exec() 会阻塞整个其余代码。不可行。

我读到的所有内容都表明 Qt gui 对象只能在主线程中运行。

所以我的问题是,如何在 init() 函数(主线程)中设置我的 gui,并允许它从那时起仅使用工作线程来运行?

我找到了这个:非主线程中的 QApplication

这些解决方案给了我一些不同的行为。方向正确,但不稳定或功能不齐全。但我不明白为什么这些是解决方案,如果 qt gui 只能在主线程中运行,并且这些解决方案将它们放在其他线程中。因此,这会发送关于什么可以在其他线程中运行、什么不能在其他线程中运行的混合消息,这会变得非常混乱。

似乎将 gui 添加到现有的 C++ 程序而不将其锁定在 exec() 函数中应该是相当常见的情况,所以我觉得我错过了一些明显的东西。有人可以帮我解决这个问题吗?

非常感谢。 菲尔


大多数时候,“主线程”==“GUI 线程”,因此人们可以互换使用这些术语——甚至官方文档也是如此。我同意这很令人困惑,因为它们不必相同。^ 实际规则是这样的:

GUI 类只能从实例化的线程访问QApplication/QGuiApplication

使用像您这样的插件,您需要执行以下操作:

  1. 创建一个新的std::thread (NOT a QThread)
  2. Run an init该线程中的函数。让它实例化你的QApplication/QGuiApplication并启动事件循环
  3. 确保所有 GUI 对象只能从该线程访问。

瞧,您现在有一个 GUI 线程,它不是您的主线程。


^Note:在 Mac OS X 上情况不同。由于 Cocoa 框架的限制,主线程必须是 GUI 线程。我上面概述的步骤适用于 Windows/Linux,但不适用于 Mac。对于 Mac,您需要将代码注入主线程 - 请参阅下面 Kuba Ober 的评论。

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

如何避免 Qt app.exec() 阻塞主线程 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 如何解决haskell中的“堆栈空间溢出”

    运行以下程序将打印 空间溢出 当前大小8388608字节 我读过了this and this 但仍然不知道如何解决我的问题 我正在使用foldr 难道不应该保证它是 尾递归 吗 到目前为止 我对 Haskell 感觉很好 直到我知道在使用强
  • 处理异常的最佳方法是什么以及如何在 ASP.NET 中处理它们

    首先 我已经熟悉了简单的异常处理语法 但我问的是处理它们的最佳地点 最佳时间和最佳方式 我正在构建一个 N 层应用程序 所以我认为 DAL 有时会生成一些错误来处理 我刚刚了解了 SqlException 类 该类有什么用 我曾经看到一个处
  • 如何使用 GitLab CI 设置最小单元测试覆盖率?

    我有一个托管在 GitLab 上的项目 该项目已经具有有效的 CI 配置 我想添加 最小代码覆盖率 的概念 我想要的是强制一个正增量 合并请求的代码覆盖率必须大于目标分支的代码覆盖率 除非它已经是 100 我会接受 最低覆盖率 80 之类的
  • 隐藏 woocommerce 设置选项卡

    我想按用户角色隐藏特定的 woocommerce 设置选项卡 不是整个子菜单 而只是一个选项卡 具体请查看 我希望商店经理能够访问大部分设置 但无法影响结账设置 我怎样才能实现这个目标 如果您想删除选项卡而不是使用 CSS 隐藏它们 那么您
  • MemberDomainMap 中的实体框架 CodeFirst KeyNotFoundException

    尝试解决我的 EF datacontext 实现中的一个错误 该错误产生了一个相当神秘的错误 Test Name Nodes can be saved Test FullName MyProj Test Integration AFData
  • 如何绕过唯一ID和引用子节点

    我的 firebase 数据库如下所示 app users gn4t9u4ut304u9g4 email uid 如何引用电子邮件和 uid 当我尝试这个时 rootScope dashtype child users orderByChi
  • 在 Firebase Cloud Messaging 中将一个项目用于多个应用程序的优缺点

    在我们公司 我们有许多适用于 Android 和 iOS 的应用程序 我们想使用 Firebase 来推送通知 那么 我们是否需要创建新的project在每个应用程序的 Firebase 中 或者只使用一个包含所有应用程序的项目会更好吗 两
  • Neo4j Cypher:复制关系并删除节点

    我正在尝试复制节点的所有内部关系 n 到另一个节点 m 两个女巫我都知道id 在删除之前 n 但我无法提出代码 这些关系可能存在也可能不存在 有人摘录吗 您将无法从关系集合中动态创建关系类型 假设即使我们收集所有传入关系如下 START n
  • VB6 中是否有导出函数(而不是类)的方法?

    我想从 Visual Basic 6 创建一个 ActiveX DLL 我想从中调用一些公共函数 我将仅从 VB6 调用此 DLL 然而 似乎只有类被导出 有什么解决方法吗 我知道有一种方法可以使用标准 WINAPI 函数从 VB6 创建
  • 将两个 Xpath 组合成一个循环?

    我正在使用 xpath 从文档中获取信息 唯一的问题是我无法将它们组合成 1 个 for 循环 以便信息在页面上正确显示 我的代码是
  • 从 UI 选择特定时区时在 javascript/jquery 中添加类

    我正在编写如下所示的 html 代码 该代码来自此url In it 显示在 ET 时区下显示 100 正确 因为它们属于正确的日期但对于其他时区 PT MT CT AT NT 某些节目的日期不正确 代码下方的屏幕截图属于该类日程操作栏从下
  • Mysql自动更新事件

    使用 php 和 MySql 无论如何都可以在日期过期时获取数据库中的日期以自行更新 即事件名称 x 的日期为 2012 05 12 在 2012 05 13 日期应更改为 2012 05 19 从 2012 05 12 算起一周 多谢你们
  • 在哪里初始化托管 C++/CLI DLL?

    使用 C CLI 创建 DLL 时 或者我应该问 是否存在与 DllMain 等效的东西 这段初始化代码中不能调用的内容是否有任何限制 Dan 关于加载器锁 C CLI 的 CLR 延迟加载以及混合模式二进制文件的正确初始化 我昨天刚刚在这
  • Pyqt:从函数“动态”附加到 qtextedit

    我的 pyqt gui 中有一个按钮 单击该按钮会运行一个函数 该函数会执行一些冗长的数学计算 在这个函数中有很多打印语句 例如 print finished calculating task1 going on to task2 因此 通
  • java中用simplexml反序列化xml

    我正在尝试使用 SimpleXML 反序列化 xml 字符串 我查看了他们的示例 但我不确定我是否掌握了这个概念 示例 XML 验证
  • 生成不带foreignObject标签的svg

    我在用dom to image js插入 问题是 它会生成一个
  • 如何从HttpClient获取json文件?

    我正在尝试获得一个json文件来自HttpClient 但是当我添加时出现错误 subscribe imports import Injectable from angular core import HttpClient HttpHead
  • 检查文件中的行是否以特定字符串开头 - 进行一些计算

    所以这就是我想做的 我有一个巨大的文件 我想在 python 中打开它并查看每一行 如果它与某个预定的字符串匹配 我想获取紧随该字符串之后的数字 将它们全部加起来并得到平均值 该文件如下所示 Data Number of hours 34
  • 在 wpf 中拖放路径

    是否可以使用鼠标事件处理程序在 wpf 中拖放路径 特别是 我想用鼠标左键拖动路径并将其放置在网格上 如何才能做到这一点 尝试这个 鉴于 文本框名称为 TextBox1 public MainWindow Initialize UI Ini
  • 如何避免 Qt app.exec() 阻塞主线程

    我是 Qt 新手 但需要解决一个难题 我创建了一个非常简单的 GUI 我需要将其添加到现有的 C 应用程序中 问题是 我只编写了一个插入更大架构的模块 这限制了我对主线程的访问 我的代码必须驻留在以下四个函数中 Init 函数 在主线程中运