Qt 线程(一) Qt 线程(一) Qt 多线程实现的两种方式 线程实现详解_恋恋西风的博客-CSDN博客_qt 跨线程调用
Qt 线程(二) Qt 线程(二) Qt 线程常用同步方式_恋恋西风的博客-CSDN博客
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();
}
}