在 QT 的不同线程中运行函数

Posted

技术标签:

【中文标题】在 QT 的不同线程中运行函数【英文标题】:Running a function in different thread in QT 【发布时间】:2010-12-22 06:27:20 【问题描述】:

在 Qt 应用程序代码中,Class A 有一个成员方法,例如 method1()。我想在另一个成员函数method2() 中调用此方法并在不同的线程中运行mehtod1()。但是我从 qt 文档中找到的内容如下。

    QThread 继承一个新的class MyThread(假设)。 用您需要的代码覆盖函数方法run()。 在Class A 中创建MyThread 的对象,然后在需要的地方调用run 函数。

但上面的内容似乎有点复杂。 Qt 中是否有任何机制,以便我可以在我的method1() 中立即创建一个新的QThread(不继承)并使用该线程运行method2(),然后在执行完成后返回method1()

如果我的问题不清楚,请告诉我。

【问题讨论】:

【参考方案1】:

是的,有你想要的方式。

这篇文章将帮助你理解为什么它不是从 QThread 继承的正确方法:https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong

本文将帮助您了解如何以真正简单的方式使用 QThread:https://www.qt.io/blog/2006/12/04/threading-without-the-headache

【讨论】:

所以等等,基本上在您提供的第一个链接中,作者告诉我不要从 QThread 子类化,而在第二个链接中,另一位作者告诉我,如果我将 QThread 子类化,Qt 线程是多么容易。我现在有点困惑,但无论如何感谢您的链接;)+1 不完全是。第一篇文章解释了为什么在这种情况下不应该继承 QThread,第二篇文章解释了如何使用 QThread 类而不继承它 对不起,我注意到了。我想这对我来说太早了。感谢您的澄清;) 链接损坏。【参考方案2】:

您可以结合线程使用 QObject 插槽和信号或事件支持。

基本上,通过信号/槽机制调用的 QObject 的槽在创建 QObject 的线程中执行。您还可以使用 QObject::moveToThread 将对象所有权从一个线程移动到另一个线程。

您还可以使用 QCoreApplication::postEvent 发布事件以在创建对象的线程中执行。

在 Qt 文档中查看有关线程和 QObjects 的更多信息(索引中的“线程和 QObjects”主题)。

解决您的问题,您可以在不同线程中使用两个单独的对象来“分散”执行。

【讨论】:

以上是关于在 QT 的不同线程中运行函数的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 在其他线程上运行函数

从qt中的另一个线程运行qtconcurrent时如何关闭程序

QT 使用C++线程池运行Lambda自定义函数

QT 使用C++线程池运行Lambda自定义函数

Qt在多线程中使用信号槽的示例

在 Qt GUI 事件线程中检测到“我正在运行”