项目场景:
任务线程需要等待一定的条件再继续执行。
条件等待是什么:
Qt中的条件等待是通过QWaitCondition类实现的。作用就是任务线程等待某个条件并睡眠,等条件满足时,线程被唤醒并执行后续操作。Qt中,QWaitCondition通常和QMutex互斥锁配对使用,互斥锁用于保护共享资源的访问,条件等待用于等待某个条件的发生,从而实现线程之间的同步和通信。
怎么使用:
- 创建QWaitCondition和QMutex对象
- 在需要等待某个条件的线程中,先获取QMutex来保护共享资源
- 判断条件是否满足,如果不满足则调用QWaitCondition的wait(),等待条件满足
- 满足条件的线程中,先获取QMutex来保护共享资源
- 修改条件,然后调用QWaitCondition的wakeOne()或者wakeAll(),唤醒等待的线程
- 被唤醒的线程再次获取QMutex,判断条件是否满足
- 如果条件满足则继续执行,否则继续等待
示例:
在这个示例中,Producer类模拟生产者线程,它会在2秒后将isReady标志设置为true,并发出信号唤醒等待的线程。Consumer类模拟消费者线程,它会在等待条件满足时被阻塞,直到收到信号后才会继续执行。在主函数中,创建了一个生产者和一个消费者对象,并启动它们的线程。然后使用wait()函数等待线程执行完毕。当生产者线程将isReady标志设置为true并发出信号后,消费者线程会被唤醒,并输出"消费者收到信号,开始消费"的信息。
#include<QCoreApplication>
#include<QThread>
#include<QWaitCondition>
#include<QMutex>
QWaitContion condition;
QMutex mutex;
bool isReady = false;
class ProducerThread : public QThread
{
public:
void run() override
{
qDebug("ProducerThread>>>>>>>");
QThread::sleep(2);
QMutexLocker locker(&mutex);
isReady = true;
condition.wakeOne();
}
};
class ConsumerThread : public QThread
{
public:
void run() override
{
qDebug(">>>>>>>ConsumerThread");
QMutexLocker locker(&mutex);
while(!isReady){
condition.wait(&mutex);
}
qDebug() << "消费者收到信号,开始消费";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ProducerThread producerThread;
ConsumerThread consumerThread;
consumerThread.start();
producerThread.start();
consumerThread.wait();
producerThread.wait();
return a.exec();
}