Qt5多线程退出

        在使用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:"<

        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,程序异常结束的同学可以按照上面的写法,完美解决。

欢迎指正。

你可能感兴趣的:(Qt5多线程退出)