如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样

Posted

技术标签:

【中文标题】如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样【英文标题】:how to create a detached thread with QThread, like in std::thread 【发布时间】:2021-12-03 23:30:54 【问题描述】:

我已经使用 QThread 在 QT 中创建了一个线程,但线程的父级在线程完成之前退出,它本身正在无限运行。

//mainwindow.cpp
void MainWindow::showEvent(QShowEvent *ev)

    QMainWindow::showEvent(ev);
    showEventHelper();


void MainWindow::showEventHelper()

    //back-end thread

    ServerStart *serverstart = new ServerStart();//initializing a pointer to my class
    QThread thread;
    serverstart->moveToThread(&thread);
    QObject::connect(&thread, &QThread::started, serverstart, &ServerStart::run);
    thread.start();

    //in std::thread i used to detache it like so:
    //std::thread worker(serverMain);
    //worker.detach();

重要提示:我正在制作一个 GUI 项目。并且我的无限线程位于 onShow() 方法中,该方法需要退出才能使应用程序继续并制作 UI。并且我还想将来从线程向主线程发送信号,并且主线程应该能够根据信号响应和修改UI。

如何在 QT 中做同样的事情?

【问题讨论】:

分离一个线程并不是一个普通的操作,也许你可以只new一个QThread,传递一个QObject来管理线程的生命周期? 哦,我想,我的帖子不清楚。我正在制作一个 GUI 项目。并且我的无限线程位于 onShow() 方法中,该方法需要退出才能使应用程序继续并制作 UI。并且我还想将来从线程向主线程发送信号,主线程应该能够根据信号响应和修改UI。 【参考方案1】:

您不能,但是根据正确使用 QThread 的 KDAB 文档,您可以通过将 QThread::finished 连接到 QThead::deleteLater 来模拟这种行为,如他们的 QThread 文档所示 https://www.kdab.com/wp-content/uploads/stories/multithreading-with-qt-1.pdf

【讨论】:

我不希望主线程退出。我编辑了我的帖子,因为我在抱歉之前没有包含它。 也许您需要QThread 为您的任务设置事件循环,请参阅KDAB 文档,了解如何将QThread 作为事件循环启动。 问题解决了,我只将线程初始化移动到int main(),它就可以工作了。

以上是关于如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cpp中的QThread使用一个对象运行同一类的两个线程?

如何在 QThread 中使用 QTimer?

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

qt测试线程是不是创建成功

Qt多线程和GUI界面假死

等待QThread时UI会阻塞/如何正确使用QThread