目录
QT多线程编程常见的有3种实现方法,一种是继承QThread类,一种是利用QThread的消息循环,还有一种是使用线程池。这三种方式在不同的场景下各有优势,下面对三种实现方法进行详细说明。
一、继承QThread类
直接继承QTread类是进行多线程编程最常用的一种方式。我们只需要定义一个自己的类,并继承自QThread即可。具体实现如下所示。
1)自定义线程类
首先我们在头文件中自定义一个类MyThread,在类中定义好构造函数、析构函数和run函数。run函数必须要重写,用于实现子线程需要完成的工作。当子线程启动时,将直接执行run函数中的代码,也只有run函数中的代码是在子线程中执行的。在我们自定义的MyThread类中,我们同样可以定义公共函数,比如setPara(),用于在启动子线程之前,为子线程对象设置参数信息。同时也可以定义信号,用于子线程向外传递参数。在类MyThread的对象中,虽然run函数中的代码运行在子线程中,但run函数依然可以访问对象中的各类成员。但当run函数访问对象中的公有成员时,若创建该子线程对象的线程也需要访问该公有成员,则可能会存在访问冲突的问题,这需要在具体实现时加以注意,避免多个线程同时访问同一内存。
类MyThread的CPP文件实现不再赘述,与所有类的实现一样。
mythread.h头文件
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QObject>
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread (QObject *parent = nullptr);
~MyThread ();
protected:
void run();//重写该函数,实现子线程需要完成的工作
private:
int a,b,c;
public:
void setPara(int,int,int);
signals:
void sendValue(int);
};
#endif // MYTHREAD_H
2)使用自定义的子线程类
使用继承自QThread的类也非常简单。首先在我们需要使用的地方,包含自定义类的头文件mythread.h,然后使用该类实例化一个对象,在启动线程前,可以调用该对象的公有函数设置一些参数,最后调用对象的start()函数启动线程。如果需要从子线程中传递出参数,则可以使用信号和槽将子线程对象的信号与当前的槽函数连接。
3)使用说明
需要指出的是,调用对象的start()函数后,将默认自动执行run