多线程优点:有时程序运行,界面卡顿,操作数据流大,执行任务多等等问题均可采用多线程,
把主线程一些任务分流给子线程,能明显减轻主线程压力,提高程序运行速度。
线程创建一般有两种方式。
创建方式1:最简单的一种是创建一个继承QObject类的文件,更改其继承对象为QThread,重写protected::void run()方法,在主界面调用start()函数便可开始线程运行。
创建方式2:该方式创建主要也是创建一个继承QObject类的文件,但不需更改继承对象,也不许 重写run()方法,只需在主线程界面创建子线程类对象,并把需要执行的任务移 动到子线程中,就可使用线程方法。
如下是案例代码展示:
案例:在labal控件上显示一个数字,数字从0数到10000截止,在设置一个按钮,点击按钮,开始显示数字。
myThread.cpp(主窗口)
#include "myThread.h"
#include "qthread2.h"
#include <QDebug>
#include <QFont>
myThread::myThread(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
ui.label->setAlignment(Qt::AlignCenter);//设置文本显示居中
QFont font;
font.setPixelSize(200);//设置文本显示字体大小
ui.label->setFont(font);
// 创建线程对象
QThread* sub = new QThread;
// 创建工作的类对象
// 千万不要指定给创建的对象指定父对象
// 如果指定了: QObject::moveToThread: Cannot move objects with a parent
qthread2* son = new qthread2;
// 将工作的类对象移动到创建的子线程对象中
son->moveToThread(sub);
// 启动线程
sub->start();
// 让工作的对象开始工作, 点击开始按钮, 开始工作
connect(ui->startBtn, &QPushButton::clicked, son, &qthread2::working);
// 显示数据
connect(son, &qthread2::setNum, this, [=](int num)
{
ui->label->setNum(num);
});
}
myThread::~myThread()
{}
myThread.h(此文件无改动)
#include <QtWidgets/QMainWindow>
#include "ui_myThread.h"
class myThread : public QMainWindow
{
Q_OBJECT
public:
myThread(QWidget *parent = nullptr);
~myThread();
private:
Ui::myThreadClass ui;
};
qthread2.cpp(子线程对象文件)
#include "qthread2.h"
#include <QDebug>
void qthread2::working()
{
qDebug() << "先前线程对象的地址:" << QThread::currentThread();
int num = 0;
while (true)
{
emit setNum(num++);
if (num == 10000)
{
break;
}
QThread::usleep(1);
}
qDebug()<<"run()线程执行完毕,子线程退出";
}
qthread2.h
#pragma once
#include <QThread>
class qthread1 : public QThread
{
Q_OBJECT
public:
qthread2();
~qthread2();
protected:
void working();
signals:
void setNum(int num);//发送
};
效果展示
本项目案例转载与互联网 原作者与原文链接如下