1、自定义1个子类继承自QRunnable
2、重写run方法,编写子线程的业务逻辑
3、使用QThreadPool的全局方法来开启这个线程
4、线程的回收不需要关注,由QThreadPool处理
5、缺点:无法使用信号槽机制
6、适合一些不需要和主线程通信的耗时的任务
举例:
窗口创建时开启1个耗时任务,打印ui线程和任务线程的id,任务线程被销毁时,打印日志
cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QRunnable>
#include<QThread>
#include<QThreadPool>
//继承自QRunnable
class MyThread:public QRunnable
{
public:
MyThread()=default;
~MyThread()
{
qDebug()<<"我被销毁了";
}
//提供退出方法
void Stop()
{
stop=true;
}
protected:
//重写run方法
void run() override
{
qDebug()<<"子线程id:"<<QThread::currentThreadId();
int num=0;
while(!stop)
{
//num自增,然后循环打印
qDebug()<<num++;
QThread::msleep(1000);
}
}
private:
bool stop=false;
};
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr) : QWidget(parent)
{
qDebug()<<"UI线程iD:"<<QThread::currentThreadId();
//创建任务
th=new MyThread;
//使用QThreadPool的全局实例来启动任务
QThreadPool::globalInstance()->start(th);
//子线程的释放不需要我们来管了
}
~Widget(){
//窗口销毁时,停止掉子线程的耗时任务
th->Stop();
};
private:
MyThread* th;
};
#endif // WIDGET_H