QT多线程有两种实现方式:
1、继承QThread
自定义类继承自QThread,重写run方法
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
protected:
//QThread的虚函数
//线程处理函数
//不能直接调用,通过start()间接调用
void run();
signals:
void isDone();
public slots:
};
实例化自定义类,调用start方法,启动该线程,会自动调用线程处理函数run
Mythread *thread = new MyThread(this);
//启动线程,处理数据
thread->start();
释放线程所占用资源
//停止线程,terminate函数用于强制结束线程,quit是等线程函数执行完成之后结束线程
thread->quit();
//等待线程处理完手头动作
thread->wait();
2、moveToThread方法
自定义类继承自QObject
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
//线程处理函数
void myTimeout();
void setFlag(bool flag = true);
signals:
void mySignal();
public slots:
private:
bool isStop;
};
实例化自定义类和QThread类,调用自定义类moveToThread方法加入到thread中
//动态分配空间,不能指定父对象
MyThread *myT = new MyThread;
//创建子线程
QThread *thread = new QThread(this);
//把自定义线程加入到子线程中
myT->moveToThread(thread);
//通过信号槽方式启动线程处理函数
connect(this, &MyWidget::startThread, myT, &MyThread::myTimeout);
//启动线程,但是没有启动线程处理函数
thread->start();
//只能通过 signal - slot 方式调用线程处理函数
emit startThread();
释放线程所占用资源
delete myT;
thread->quit();
thread->wait();
3、其他使用方式
QThread调用start方法时发射started信号,执行run函数,run函数执行后会发射finished信号,可以直接通过lambda表达式的方式来执行线程操作,通过deleterLater来释放线程资源
QThread *thread = new QThread;
connect(thread, &QThread::started, this, [] {
int i = 0;
});
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
thread->start();