QT:基于moveThread方法,优雅的关闭一个线程

目录

简述

程序演示

示例代码


简述

其操作方式很简单,就是在线程执行处通过使用标记位的方式来停止线程。

QT内部其实已经帮我们写好了,我们在合适的地方调用就行了

其标记位函数是以下两个:

  • QThread::currentThread()->requestInterruption();          //请求中断
  • QThread::currentThread()->isInterruptionRequested()   //当接收到上面中断请求后,该函数返回true

 

程序演示

 

示例代码

object对象

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>
#include <QThread>
#include <QDebug>

class MyObject : public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = 0){}
    ~MyObject(){}

public slots:
    void start()//实际的线程执行函数
    {
        int count = 0;
        while(!QThread::currentThread()->isInterruptionRequested())//如果没收到中断请求,就执行循环体里面的内容
        {
            qDebug()<<"new Thread: "<<QThread::currentThreadId()<<" " <<count++;
            QThread::sleep(1);
        }
        QThread::currentThread()->exit(0);
    }
};

#endif // MYOBJECT_H

 

widget对象

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class QPushButton;
class MyObject;
class QThread;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

    QPushButton* pStartBtn_;
    QPushButton* pStopBtn_;

    MyObject* pObject_;
    QThread*  pThread_;
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QObject>
#include <QThread>
#include <QDebug>
#include "my_object.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    pStartBtn_ = new QPushButton(QStringLiteral("开启线程"),this);
    pStopBtn_ = new QPushButton(QStringLiteral("停止线程"),this);
    pStartBtn_->setGeometry(0, 0, 200, 50);
    pStopBtn_->setGeometry(200, 0, 200, 50);

    connect(pStartBtn_, &QPushButton::clicked, [&]()
    {
        pObject_ = new MyObject;
        pThread_ = new QThread;
        pObject_->moveToThread(pThread_);                                //将pObject_对象移动到新的线程中去
        connect(pThread_, &QThread::started, pObject_, &MyObject::start);//线程开始后的信号,线程开始就执行pObject_对象的函数
        connect(pThread_, &QThread::finished, [&]()                      //线程结束后的信号,线程结束就会删除这两个对象
        {
            pObject_->deleteLater();
            pThread_->deleteLater();
        });

        pThread_->start();
        qDebug()<<"main thread: "<< QThread::currentThreadId();
    });
    connect(pStopBtn_, &QPushButton::clicked, [&]()
    {
        pThread_->requestInterruption(); //请求中断线程
    });

}

Widget::~Widget()
{
    delete ui;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值