在使用Qt开发界面的工作中几乎无法避免对数据的处理,那我们第一想到的是将数据处理部门放到子线程,那么就有了这样的问 题:如何正确的结束数据处理线程?
在Qt5以后,官方也推荐使用了一种子线程工作的方式:void QObject::moveToThread(QThread *targetThread),可以看到该方法属于QObject类,我们在实现数据处理线程的时候只需要继承QObject类使之具有信号槽功能,之后,就是普通类的写作方式一样将耗时操作写到槽函数中即可。
在使用的时候我们需要创建一个QThread对象来承载我们的数据处理类,下面是基本的代码:
1.数据处理类.cpp:
WorkThread::WorkThread(QObject *parent) : QObject(parent)
{
}
//耗时操作槽函数(测试代码每秒钟输出i值)
void WorkThread::slot_DoWork()
{
for(int i=0;i<10;i++)
{
//Qt5.2以后引入的一个线程中断方法,在使用类中我们会发送中断请求使线程结束
if(QThread::currentThread()->isInterruptionRequested())
{
qDebug()<<"isInterruptionRequested";
break;
}
qDebug()<<"do work:"<<i;
QThread::currentThread()->sleep(1);
}
}
2.使用方法.cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建我们的数据处理类
m_work = new WorkThread;
//将数据处理类加入到子线程,m_thread是Widget类的一个成员变量,类型:QThread
m_work->moveToThread(&m_thread);
//通过信号与数据处理线程通信,注:connect的最后一个参数
connect(ui->startButton,&QPushButton::clicked,m_work,&WorkThread::slot_DoWork,Qt::QueuedConnection);
//当线程结束时,释放数据处理类
connect(&m_thread,&QThread::finished,m_work,&WorkThread::deleteLater);
//开启数据处理线程
m_thread.start();
}
Widget::~Widget()
{
delete ui;
m_thread.requestInterruption();//请求线程中断,我们在耗时操作的判断了此请求
m_thread.quit();
m_thread.wait();
}
以上的两个cpp文件概要的介绍了moveToThread及线程退出方法,留作备忘同时也希望可以帮助到初次使用的同学。
遇到:QThread: Destroyed while thread is still running,程序异常结束的同学可以按照上面的写法,完美解决。
欢迎指正。