Qt 使用moveToThread创建线程调用

QT中使用多线程有很多种方法:
1.继承QThread,并且实现run方法
2.继承QRunable,实现run方法
3.使用moveToThread
moveToThread主要是让当前继承在QObject中类对象关联到QThread中,通过信号槽的方式实现线程的启动和结束.
Qt 使用moveToThread创建线程调用_第1张图片
工作类:

#pragma once

#include 

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 
#include 

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 
#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 
#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

你可能感兴趣的:(qt,线程,moveToThread,多线程)