目录
简述
其操作方式很简单,就是在线程执行处通过使用标记位的方式来停止线程。
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;
}