QT中使用多线程有很多种方法:
1.继承QThread,并且实现run方法
2.继承QRunable,实现run方法
3.使用moveToThread
moveToThread主要是让当前继承在QObject中类对象关联到QThread中,通过信号槽的方式实现线程的启动和结束.
工作类:
#pragma once
#include <QObject>
class Worker : public QObject {
Q_OBJECT
public:
Worker(QObject *parent);
~Worker();
private slots:
void slotWork();
signals:
void sigCurrentValue(int v);
void sigWorkFinish();
private:
int _minValue = 0;
int _maxValue = 100;
int _currentValue = 0;
};
#include "Worker.h"
#include <QThread>
#include <QDebug>
Worker::Worker(QObject *parent)
: QObject(parent) {
}
Worker::~Worker() {
}
void Worker::slotWork() {
while (true) {
_currentValue++;
QThread::msleep(100);
qDebug() << _currentValue << QThread::currentThreadId();
emit sigCurrentValue(_currentValue);
if (_currentValue>= 100){
break;
}
}
//发送信号以主动结束线程运行
emit sigWorkFinish();
}
主界面类:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_Thread.h"
class QThread;
class Worker;
class Thread : public QMainWindow {
Q_OBJECT
public:
Thread(QWidget *parent = Q_NULLPTR);
private:
void init();
private slots:
void slotStartThread();//开始启动线程
void slotFinishThread();//结束线程
void slotCurrentValue(int v);
private:
Ui::ThreadClass ui;
QThread* _thread = nullptr;
Worker* _worker = nullptr;
};
#include "Thread.h"
#include <QThread>
#include "Worker.h"
Thread::Thread(QWidget *parent)
: QMainWindow(parent) {
ui.setupUi(this);
init();
}
void Thread::init() {
_thread = new QThread;
_worker = new Worker(nullptr);
_worker->moveToThread(_thread);
connect(ui.wcButtonStart, SIGNAL(clicked()), this, SLOT(slotStartThread()));
connect(_thread, SIGNAL(started()), _worker, SLOT(slotWork()));
connect(_thread, SIGNAL(finished()), _worker, SLOT(deleteLater()));
connect(_worker, SIGNAL(sigWorkFinish()), this, SLOT(slotFinishThread()));
connect(_worker, SIGNAL(sigCurrentValue(int)), this, SLOT(slotCurrentValue(int)));
ui.progressBar->setRange(0, 100);
ui.progressBar->setValue(0);
}
void Thread::slotStartThread() {
_thread->start();
}
void Thread::slotFinishThread() {
_thread->quit();
}
void Thread::slotCurrentValue(int v) {
ui.progressBar->setValue(v);
}
源码下载
aaa