QWaitCondition 类
QWaitCondition 用于多线程的同步,一个线程调用QWaitCondition::wait() 阻塞等待,直到另一个线程调用QWaitCondition::wake() 唤醒才继续往下执行。
#include "qmythread.h"
#include <QWaitCondition>
#include <QTime>
#include <QMutex>
QMutex mutex;
QWaitCondition newdateAvaiable;
int seq=0;
int diceValue=0;
QThreadProducer::QThreadProducer()
{
}
void QThreadProducer::stopThread()
{
QMutexLocker locker(&mutex);//在locker的生存周期内下面的程序是受保护的;
m_stop=true;
}
void QThreadProducer::run()
{
m_stop=false;
seq=0;
qsrand(QTime::currentTime().msec());
while (!m_stop) {
mutex.lock();
diceValue=qrand();
diceValue=(diceValue%6)+1;
seq++;
mutex.unlock();
//唤醒所有线程
newdateAvaiable.wakeAll();
msleep(500);//线程休眠500毫秒
}
}
QThreadConsumer::QThreadConsumer()
{
}
void QThreadConsumer::stopThread()
{
QMutexLocker locker(&mutex);
m_stop=true;
}
void QThreadConsumer::run()
{
m_stop=false;
while (!m_stop)
{
mutex.lock();
/*QWaitCondition 用于多线程的同步,一个线程调用QWaitCondition::wait() 阻塞等待,
* 直到另一个线程调用QWaitCondition::wake() 唤醒才继续往下执行。*/
newdateAvaiable.wait(&mutex);//先解锁mutex,是其他线程能够使用mutex
emit newValue(seq,diceValue);
mutex.unlock();
}
}
其中:QThreadProducer::run()函数负责产生数据(每隔500ms产生一个数据),新的数据产生后通过等待条件唤醒所有等待的线程,即:
通过newdataAvailiable.allWake()唤醒所有等待线程;
QthreadConsumer::run()函数中的while循环,首先需要将互斥量锁定,再执行下面的语句:newdataAvailable.wait(&mutex);
newdataAvailable.wait(&mutex);中以mutex作为输入参数,内部首先会解锁mutex,是其他线程可以使用mutex.newdataAvailable进入等待状态。当QThreadProducer产生数据使用newdataAvailable.wakeAll()唤醒所有线程,newdataAvailable.wait(&metuex)会再次锁定mutex,然后退出阻塞状态,以执行后面的语句;
所以,当两个线程同时运行时,即.started()后,均开始执行.run(), 由于 QthreadConsumer通过newdataAvailable.wait(&mutex);处于等待状态,不占用mutex所以QThreadProducer::run()可以顺利执行,直到解除mutex``,通过``newdataAvailable.wakeAll()唤醒处于休眠的QthreadConsumer线程。此时QthreadConsumer会再次锁定mutex,然后退出阻塞状态,以执行后面的语句;
本文介绍了如何在Qt中使用QWaitCondition进行线程间的同步,展示了QThreadProducer和QThreadConsumer如何通过newdateAvaiable信号槽机制实现数据的生产与消费。QThreadProducer定时生成数据并唤醒消费者,而消费者在接收到信号后继续执行。
1971

被折叠的 条评论
为什么被折叠?



