
QT多线程
Qt程序中开启多线程有多种方式,如:
- 继承QThread类,重写run函数
- 继承自QObject,并调用moveToThread函数
- 调用QtConcurrent::run函数,传入耗时函数即参数
本篇文章主要对moveToThread的用法进行详解。
moveToThread使用步骤
步骤1:
创建耗时操作类Worker,同时继承QObject,耗时操作都以槽的方式实现,如work1、work2……
Worker.h
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr);
signals:
public slots:
void work1(); // 耗时操作1
void work2(); // 耗时操作2
};
#endif // WORKER_H
Worker.cpp
#include "Worker.h"
#include <QThread>
#include <QDebug>
Worker::Worker(QObject *parent) : QObject(parent)
{
}
void Worker::work1()
{
QThread::msleep(1000);
qDebug() << "work1";
}
void Worker::work2()
{
QThread::msleep(2000);
qDebug() << "work2";
}
这里的耗时操作比较简单粗暴,即直接调用msleep,分别等待1s和2s。
步骤2:
新建QThread实例:
QThread *pThread = new QThread;
步骤3:
新建Worker实例:
Worker *pWorker = new Worker;
步骤4:
使用Worker实例调用moveToThread函数,并传入QThread的实例作为参数:
pWorker->moveToThread(pThread);
步骤5:
关联信号和槽:
connect(this, SIGNAL(startWork1()), pWorker, SLOT(work1())); // 执行耗时操作1
connect(this, SIGNAL(startWork2()), pWorker, SLOT(work2())); // 执行耗时操作2
connect(pThread, SIGNAL(finished()), pWorker, SLOT(deleteLater())); // 析构Worker类
步骤6:
启动线程:
pThread->start();
此时所有的准备工作都已完成,下面只需要在要执行耗时操作的地方发送相应的信号即可。
步骤7:
emit startWork1();
emit startWork2();
步骤8:
关闭线程:
pThread->quit();
pThread->wait();
效果演示
00:00
可以看到所有耗时操作都在排队进行,而且主界面也丝毫不受影响,没有任何卡顿。
© 版权声明
文章版权归作者所有,未经允许请勿转载。






非常清晰明了
收藏了,感谢分享