0
点赞
收藏
分享

微信扫一扫

Qt 线程(三) QT 线程退出的几种方式


QTread 退出,可以几种方式,使用变量; 也可以使用 ​​QWaitCondition​​;

1. 使用变量 ,外部将变量置为 false

#define WORKOBJECT_H


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

#include<QMutexLocker>
#include<QMutex>
#include<QWaitCondition>

class WorkObject : public QObject
{

Q_OBJECT
public:
explicit WorkObject(QObject *parent = nullptr);

signals:

public slots:
void doWork();

void stopWork();
private:
bool exitflag;

QWaitCondition mWaitStatusCondition;
QMutex mWaitMutex;
};

#endif // WORKOBJECT_H

cpp

#include "workobject.h"

WorkObject::WorkObject(QObject *parent) : QObject(parent)
{

}
void WorkObject::doWork()
{

while(true)
{
QMutexLocker locker(&mWaitMutex);
if(!exitflag)
{
qDebug() << "MyThread eixt ================ :" ;
return;
}
// if(mWaitStatusCondition.wait(&mWaitMutex,1))
// {
// qDebug() << "MyThread eixt ================ :" ;
// return;
// }

qDebug() << "MyThread thread id:" << QThread::currentThreadId();
//sleep(10);
//QThread::sleep(1);
}

qDebug() << "doWork thread exit========:" << QThread::currentThreadId();
}

void WorkObject::stopWork()
{
QMutexLocker locker(&mWaitMutex);
{
exitflag = false;
// mWaitStatusCondition.wakeAll();

}
}

2. 也可以使用 ​​QWaitCondition​​

QWaitCondition最大的好处,我以为,是能在一个线程中唤醒一个或多个其它线程,固然前提是,其它线程在等待某个QWaitCondition,不然不起做用,你唤醒也没用。QWaitCondition必须与QMutex或者QReadwriteLock一块儿用


mWaitStatusCondition.wakeAll();


#include "workobject.h"

WorkObject::WorkObject(QObject *parent) : QObject(parent)
{

}
void WorkObject::doWork()
{

while(true)
{
QMutexLocker locker(&mWaitMutex);
if(!exitflag)
{
return;
}
if(mWaitStatusCondition.wait(&mWaitMutex,1))
{
qDebug() << "MyThread eixt ================ :" ;
return;
}

qDebug() << "MyThread thread id:" << QThread::currentThreadId();
//sleep(10);
//QThread::sleep(1);
}

qDebug() << "doWork thread exit========:" << QThread::currentThreadId();
}

void WorkObject::stopWork()
{
QMutexLocker locker(&mWaitMutex);
{
//exitflag = false;
mWaitStatusCondition.wakeAll();

}
}

举报

相关推荐

0 条评论