qt中,主线程启动了一个子线程,子线程启动后怎么让主线程阻塞,直到子线程中发出某个信号给主线程,主线程才结束阻塞继续执行

        在客户端中,我们创建了后台线程,去执行一些后台操作,但有些全局单例以及初始化我们希望是在后台线程中完成的,而且主线程创建界面等动作必须在那之后执行。现在我们就来实现这个功能:

1.后台线程mainbackgroundprocess.h:

class MainBackgroundProcess : public QObject
{
    Q_OBJECT
public:
    explicit MainBackgroundProcess(QObject *parent = nullptr);
    static MainBackgroundProcess * instance();
    void init();
private:
    static MainBackgroundProcess * m_mainProcess;
}

class MainBackgroundProcessThread : public QThread
{
    Q_OBJECT
public:
    void run() override {
        QObject::connect(this, &QThread::finished, MainBackgroundProcess::instance(), &QObject::deleteLater);
        MainBackgroundProcess::instance()->init();
        emit readyToContinue(); // 发出工作完成,可以继续执行信号
        exec();
    }

signals:
    void readyToContinue(); // 声明工作完成信号
};

2.主线程main.cpp:

#include <QThread>
#include <QEventLoop>

int main(int argc, char *argv[])
{
    ...
    //MainBackgroundProcess
    MainBackgroundProcessThread threadBack;

    //wait
    QEventLoop loop;
    QObject::connect(&threadBack, &MainBackgroundProcessThread::readyToContinue, &loop, &QEventLoop::quit);
    threadBack.start();
    loop.exec();// 主线程在这里阻塞,直到子线程发出readyToContinue信号

    // 主线程继续执行...
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-11 13:42:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-11 13:42:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-11 13:42:06       82 阅读
  4. Python语言-面向对象

    2024-01-11 13:42:06       91 阅读

热门阅读

  1. LLM/VLM for Robotic Agent

    2024-01-11 13:42:06       58 阅读
  2. 前端判断对象为空(6种)

    2024-01-11 13:42:06       50 阅读
  3. #Uniapp:内置组件scroll-view

    2024-01-11 13:42:06       53 阅读
  4. 【数据库原理】(16)关系数据理论的函数依赖

    2024-01-11 13:42:06       49 阅读
  5. 超市账单管理系统产品数据新增Servlet实现

    2024-01-11 13:42:06       52 阅读
  6. 9.网络进阶管理

    2024-01-11 13:42:06       47 阅读
  7. linux: netstat 与 ss 用法详解

    2024-01-11 13:42:06       49 阅读