创建工作者线程类:
worker.h文件
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
class Worker : public QObject
{
Q_OBJECT
public:
//explicit Worker(QObject *parent = nullptr);
explicit Worker(QObject *parent = NULL);
void setWorkFlag(bool stopWork = true);
signals:
void workSignal(int*);
public slots:
void doSomething(); //线程处理函数
private:
bool bStopWork; //工作线程启停控制
};
#endif // WORKER_H
worker.cpp文件
#include "worker.h"
#include <QThread>
#include <QDebug>
#include <QTimer>
Worker::Worker(QObject *parent) : QObject(parent)
{
bStopWork = false;
}
void Worker::doSomething()
{
static int i = 0;
while (!bStopWork)
{
i++;
QThread::sleep(1);
emit workSignal(&i); //与ui交互显示内容
qDebug() << "worker thread id:"<< QThread::currentThread(); //打印输出当前工作线程id
}
}
void Worker::setWorkFlag(bool stopWork)
{
bStopWork = stopWork;
}
测试线程窗体:
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include"worker.h"
#include<QThread>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
signals:
void startThread(); //启动子线程信号,必须通过信号-槽的方式启动线程函数
private slots:
void on_btnStartThread_clicked();
void on_btnStopThread_clicked();
void workSignalCallBack(int *);//工作者回调事件
void ondestroyed();//程序销毁事件
private:
Ui::MainWindow *ui;
Worker * m_myWork; //工作者
QThread * m_thread;//工作者绑定的子线程
};
#endif // MAINWINDOW_H
mainwindow.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_myWork = new Worker; //创建工作者对象
m_thread = new QThread(this); // 创建子线程
m_myWork->moveToThread(m_thread);//把worker添加到子线程
connect(m_myWork,SIGNAL(workSignal(int*)),this,SLOT(workSignalCallBack(int*))); //worker工作信号回调函数绑定
connect(this,&MainWindow::startThread,m_myWork,&Worker::doSomething); //启动线程信号和具体工作函数绑定
connect(this,&MainWindow::destroyed,this,&MainWindow::ondestroyed); //程序销毁事件
qDebug()<<"主线程 id ="<<QThread::currentThread();
m_thread->start();//启动子线程
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnStartThread_clicked()
{
//开始线程工作
m_myWork->setWorkFlag(false);
emit startThread();
}
void MainWindow::on_btnStopThread_clicked()
{
//停止线程工作
m_myWork->setWorkFlag(true);
}
void MainWindow::workSignalCallBack(int * a)
{
ui->lcdNumber->display(*a); //显示工作内容
}
void MainWindow::ondestroyed()
{
m_myWork->setWorkFlag(true); //控制线程工作函数停止
m_thread->quit();
m_thread->wait();
delete m_myWork;
}