如何在 Qt c++ 中管理 QThread?

Posted

技术标签:

【中文标题】如何在 Qt c++ 中管理 QThread?【英文标题】:How to manage QThread in Qt c++? 【发布时间】:2015-07-06 13:17:08 【问题描述】:

我正在尝试在 Qt 中学习 QThread。我为 QThread 编写了以下代码,该代码运行良好。

    QThread* mThread = new QThread;
    FaceCutThread* mFaceCut = new FaceCutThread();
    mFaceCut->moveToThread(mThread);

    connect(mThread, SIGNAL(finished()), mFaceCut, SLOT(deleteLater()));
    connect(this, SIGNAL(operateFaceCut(std::string)), mFaceCut, SLOT(processFaceCut(std::string)));
    connect(mFaceCut, SIGNAL(isFinisedFaceCut(QImage,bool)), this, SLOT(handleFaceCutResults(QImage,bool)));
    mThread->start();

现在我想再添加一个应该作为 QThread 工作的类,例如;

Enroll *mEnroll = new Enroll();

我应该在以前的 mThread 中使用 mEnroll 对象还是应该创建新的 mThread2;

QThread* mThread2 = new QThread;
mEnroll->moveToThread(mThread2);

有什么优点和缺点?

【问题讨论】:

创建新线程的一个缺点是创建线程需要时间成本。 【参考方案1】:

这取决于你想要达到什么目标。如果将相同的类放在同一个线程中,那么它们将在同一个线程中执行。如果您希望它们在单独的线程中执行,则将它们放到另一个线程中。例如,如果您想独立使用它们 - 一个线程加载/读取数据,第二个处理数据并通过信号连接它们。如果线程共享资源等,单独的线程会产生同步问题。(长主题http://www.drdobbs.com/tools/avoiding-classic-threading-problems/231000499)在同一个线程中拥有对象意味着对象具有共同点

寄存器状态(包括PC和堆栈指针)

堆栈

信号掩码

优先级

线程私有存储

这可以被视为优势或劣势......

【讨论】:

以上是关于如何在 Qt c++ 中管理 QThread?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QT 中停止 qThread [重复]

如何在 Qt 中正确终止 QThread?

PyQt:如何终止可重用的 QThread

如何向 Qt 中 QThread 类的特定对象发出信号?

帮助 QT 编程与 QThread 类,如何使用它

如何增加 Qt 中线程的堆栈大小 - QThread::setStackSize() 似乎不起作用?