概述
学习内容:通过moveToThread函数,将类的对象放入子线程运行。子线程运行完毕后停止该线程,并释放资源。
环境
IDE:Qt creator 4.11.0
编译器:MinGW 5.3.0 32bit for C++
代码
1、worker.h
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <QDebug>
class Worker : public QObject
{
Q_OBJECT
public:
Worker();
signals:
void loopFinished();
public slots:
void loop();
};
#endif // WORKER_H
2、worker.cpp
#include "worker.h"
Worker::Worker()
{
}
void Worker::loop()
{
int i;
for (i = 0; i < 100000; i ++)
{
qDebug() << i;
}
qDebug() << "循环操作结束!";
emit loopFinished();
}
3、mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QThread>
#include "worker.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QPushButton *m_pStart;
Worker *m_pWorker;
QThread *m_pThread;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
4、mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pStart = new QPushButton("开始", this);
m_pStart->setGeometry(QRect(50,50,120,120));
m_pWorker = new Worker();
m_pThread = new QThread();
m_pWorker->moveToThread(m_pThread);
m_pThread->start();
connect(m_pStart, SIGNAL(clicked()), m_pWorker, SLOT(loop()));
connect(m_pWorker, SIGNAL(loopFinished()), m_pThread, SLOT(quit()));
connect(m_pThread, SIGNAL(finished()), m_pWorker, SLOT(deleteLater()));
}
MainWindow::~MainWindow()
{
delete ui;
}
总结
1、如果去掉下列代码,程序将变得很卡。因为循环在主线程进行,阻止了主程序UI的刷新。
m_pThread = new QThread();
m_pWorker->moveToThread(m_pThread);
m_pThread->start();
2、代码下载