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