Qt:将事件发布到 QThread 的正确方法?

2024-07-01

在我的 Qt 应用程序中,我有一个主线程和一个工作线程。工作线程子类QThread并通过处理事件customEvent。这是主线程发送要由工作线程处理的事件的正确方法吗?

QThread* myWorkerThread = // ...

QApplication::instance()->postEvent (myWorkerThread, new MyWorkRequestEvent(/* ... */);

如果我正确地阅读了文档,它指出事件是在拥有事件接收者的对象的线程上处理的。自从QThread是由主线程创建的,它归主线程所有——那么这个事件会由主线程处理吗(这是违反直觉的,在我的情况下是错误的)?


你的理解是正确的,而且确实很不直观:)

很多麻烦来自于 QThread 的文档,该文档建议对 QThread 进行子类化。尽管Qthread有自己的事件循环,但只有在run()方法(在该线程中创建)中创建的QObject的事件和信号才会在QThread事件循环中处理。

最好将线程逻辑封装在 QObject 子类中,然后将该对象移动到普通 QThread 的实例中。然后,您可以使用信号(将跨线程边界正确排队)或自定义事件与该 QObject 进行通信。

这个里面有一些链接类似的问题 https://stackoverflow.com/questions/4093159/what-is-the-correct-way-to-implement-a-qthread-example-please这应该有帮助。

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

Qt:将事件发布到 QThread 的正确方法? 的相关文章

  • 策略模式与依赖注入

    策略模式与依赖注入有何不同 即以下是您可以使用策略模式执行的操作 class Foo private readonly ISortAlgo sortAlgo public Foo ISortAlgo sortAlgo sortAlgo so
  • 如何将流写入内存流?

    public void doprocess TcpClient client MemoryStream ms new MemoryStream Stream clStream client GetStream byte buffer 1 n
  • C++11 中的延迟初始化顺序

    考虑以下代码 分为三个编译单元 a h struct A void Register const char s const char m s 10 int m i 0 A GetA a cpp include a h include
  • 如何使用OpenCV的归一化相关性?

    如何使用 OpenCV 的归一化相关性 有人可以提供代码示例吗 我的问题 我有一个螺丝头图像 需要找到螺丝的中心 所以我正在考虑使用 OpenCV 相关性 这是一个好主意吗 您可以在下面的链接下找到示例图像 http imageshack
  • 复制空对象是否涉及访问它

    灵感来自this https stackoverflow com a 48273386 4832499问题 struct E E e E f e Accesses e To access https timsong cpp github i
  • 浮点指令异常——FLDZ故障?

    I am trying to debug the problem I posted earlier here C and pin tool very weird DOUBLE variable issue with IF statement
  • 泛型类中可空的泛型字段

    我正在尝试做这样的事情 public class MySuperCoolClass
  • UWP 导航 (Template10)、枢轴控制、多帧

    我正在尝试在我的 UWP 应用程序中实现以下导航样式 使用 Template10 但正在努力如何使用多个帧作为独立的历史堆栈 在枢轴的每个框架内 我希望有一个独立的框架 它有自己的历史记录和后堆栈 只能通过枢轴在框架之间导航 我正在考虑使用
  • 我应该如何继承IDisposable?

    为了保护无辜者 班级名称已更改 如果我有一个名为 ISomeInterface 的接口 我还有继承该接口的类 FirstClass 和 SecondClass FirstClass 使用必须处置的资源 二等舱没有 那么问题来了 我应该从哪里
  • 关闭Python线程以防止内存泄漏

    如何关闭 Python 线程以确保线程内内存中的所有内容都从内存中清除 目前 我有一个通过以下方式加入的线程列表 for t in threadlist t join 5 这些线程最初是通过循环传递给每个线程的参数列表来创建的myfunc它
  • 使用迭代器与索引访问向量元素有什么区别?

    使用迭代器与索引访问向量元素有什么优点 为什么迭代器比索引更好 在索引不可用的情况下 例如 std list 对于 例子 在通用函数接受迭代器的情况下 叫做 编写应该使用的函数模板时 不止一种容器类型 他们的存在是为了创造均匀性在所有容器和
  • 在哪里可以查看 LINQ 源代码?

    我需要编写自己版本的 except 方法 或者至少以某种方式修改 LINQ 方法的工作方式 我正在与大型自定义对象列表进行比较 并且需要将匹配项从列表 A 连接到列表 B 我认为除外哈希表构建是进行比较的最快方法 但该方法只会返回非匹配项
  • 仅仅“抛出”一次捕获有好处吗?

    与一位同事就他将大部分功能包装在 try catch 中的做法进行了 激烈辩论 但 catch 中只有一个 抛出 例如 Private sub foo try Do something catch throw And nothing els
  • 反序列化 jQuery 序列化表单

    我正在尝试将表单输入传递到 WebMethod 中并执行某些操作 我用了jQuery 序列化 http api jquery com serialize
  • 通过构建服务器进行 Nuget 恢复“无法找到版本”

    我有一个 VS 解决方案 作为 TeamCity Build 的一部分 我们从私有 NuGet feed myget 和公共 feed nuget org 恢复包 大多数软件包都可以正常恢复 但它会挂在下面的 WebApi 和 Mono S
  • 如何在调试 C 程序时将 gdb 值转换为 python 数字对象

    我在调试 C 程序时使用 python2 6 的 gdb 模块 并希望根据实例的 Type 将 gdb Value 实例转换为 python 数字对象 变量 例如 把我的C程序SomeStruct gt some float val 1 6
  • fread 在 C 中如何工作?

    我有内容为的文本文件 12345678901222344567 然后我用这段代码来读取内容 FILE pFile int c char buffer 256 pFile fopen myfile txt r int a 50 0 fread
  • 如何将 ContextMenuStrip 添加到 ToolStripMenuItem

    我希望当我单击菜单项时 显示一个包含 删除 重命名 等项目的上下文菜单 当右键单击菜单项时 如何将自身绑定为上下文菜单 我脑海中跳出的第一个想法是连接一些MouseDown事件于ToolStripMenuItem并显示第二个ContextM
  • 解析日期时间字符串

    我在使用 DateTime ParseExact 解析 DateTime 字符串时遇到一些困难 DateTime result CultureInfo provider CultureInfo InvariantCulture Parse
  • 如何防止禁用的 ToolStripMenuItem 在鼠标悬停时显示边框?

    Yes exactly same as the title in my project some of toolstripmenuitems were disabled But when i bring the cursor over th

随机推荐