Qt多线程编程—使用Qt自身的线程类
使用Qt自身的线程类进行多线程编程,有两种方法。
**方法1概述:**首先用一个类继承QThread
类,然后重新改写QThread
类的虚函数run()
。只要实例化该类,然后调用函数start()
,就可以开启新的多线程(run()
会被自动调用),所以线程的具体实现过程放在run()
里面。
**方法二概述:**先用一个类继承QObject
类,然后在该类中添加一个成员函数working()
(名字无所谓)用来处理具体子线程的工作,在主线程调用QObjec
t类提供的moveToThread()
方法。
方法1具体步骤
1:需要创建一个线程类的子类,让其继承QT中的线程类 QThread,比如:
class MyThread:public QThread
{
......
}
2:重写父类的 run() 方法,在该函数内写子线程要处理的具体操作
class MyThread:public QThread
{
......
protected:
void run()
{
........
}
}
3:在主线程中创建子线程对象实例,关键字new
MyThread * subThread = new MyThread;
4:启动子线程, 调用 start() 方法
subThread->start();
方法1实操
这里以一个计数器的小案例为例,创建一个对话框项目,实现主线程和子线程之间的通信,启动线程计数时,右下加的计数器显示开始读秒,点击重置计数器按钮时,读秒数清零后继续计数,点击停止线程按钮时,计数停止。
(1)新建一个MyThread
类,继承QThread
类
(2)在MyThread.cpp
中重写MyThread
类的虚函数run()
,这就是子线程实现的具体功能函数
(3)对ui界面的四个按钮设置对应的槽函数on_pushButton_clicked() - on_pushButton_clicked3()
,在需要用到多线程的地方实例化MyThread
,当点击按钮“启动线程计数”(按钮1)时,调用MyThread::start()
函数,会开启对应的线程,自动运行重写的run()
函数。
//dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "MyThread.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class Dialog;
}
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr)