如何使用线程实例化多个 QApplication

Posted

技术标签:

【中文标题】如何使用线程实例化多个 QApplication【英文标题】:How to use threads to instantiating multiple QApplication 【发布时间】:2015-04-24 10:13:31 【问题描述】:

我找到了防止app.exec()阻塞主线程here的解决方案。

我尝试实现此功能,但出现以下错误:

WARNING: QApplication was not created in the main() thread.
QWidget: Cannot create a QWidget without QApplication

这是我的代码:

PB 是一个具有初始化 GUI 的静态函数的类。

pb.cpp:

bool PB::Init(int argc, char *argv[],
        int ID) 

    QApplication app(argc, argv);
    PB PB(ID); // The constructor creates an instance of the pushbutton qt object
    app.exec();
    return true; // Do I even need this because app.exec() runs an infinite loop right?


main.cpp:

int main(int argc, char *argv[]) 

    std::thread first(&PB::Init, argc, argv, 0);
    std::thread second(&PB::Init, argc, argv, 1);

    first.join();
    second.join();


问题是,我正在类中初始化 QApplication,所以它应该可以工作...我确保它可以与主要不使用 QApplication 的单独测试一起工作:

int main(int argc, char *argv[]) 

    PB::Init(argc, argv, 0);


此代码运行良好。所以只有当我添加线程时我才会得到这个错误。

【问题讨论】:

为什么你认为你需要两个 QApplications?如果您需要,QEventLoop 或 QThread::exec() 将提供事件循环。 我不需要 QApplication 只是为了能够构造一个 QWidget 吗?当我删除 QApplications 时,我收到 QWidget: Must construct a QApplication before a QWidget 错误。 抱歉,Qt 小部件不支持多标题。 QWidget 必须在 QApplication 所在的单个(主)线程上创建。使用线程计算数据,并使用 Qt::QueuedConnection 信号将结果传递给主线程以在 GUI 上可视化。检查threaded mandelbrot example 关于主(GUI)和工作线程通信。 【参考方案1】:

您可以在不同的线程中创建QApplication,但您应该在此线程中创建所有 GUI 类的对象,否则您会得到未定义的行为。 QApplication 是单例的,所以你不能在不同的线程中创建QApplication 的多个实例。

【讨论】:

一点:没有“主线程”这样的东西。您可以安全地在“非主”thead 中创建QApplication,并且不会有 UB。但你说得对,QApplication 是单身人士。 @Justin 在创建 QApplication 的第二个实例时遇到问题。它不依赖于线程。请,修复你的答案。 @SaZ,谢谢,我修好了。您可以编辑我的英语 (=

以上是关于如何使用线程实例化多个 QApplication的主要内容,如果未能解决你的问题,请参考以下文章

c++ 如何在构造函数中启动一个线程,从命名管道读取数据?

PHP在单例模式中,是多个线程只有一个实例还是一个线程只有一个实例

Servlet实例数量到底多少,是否线程安全

如何使用非常量值来实例化一个类的多个对象?

单例模式

如何在 symfony 中实例化多个 mqtt 客户端