Qt 条件等待

项目场景:

        任务线程需要等待一定的条件再继续执行。


条件等待是什么:

        Qt中的条件等待是通过QWaitCondition类实现的。作用就是任务线程等待某个条件并睡眠,等条件满足时,线程被唤醒并执行后续操作。Qt中,QWaitCondition通常和QMutex互斥锁配对使用,互斥锁用于保护共享资源的访问,条件等待用于等待某个条件的发生,从而实现线程之间的同步和通信。


怎么使用:

  1. 创建QWaitCondition和QMutex对象
  2. 在需要等待某个条件的线程中,先获取QMutex来保护共享资源
  3. 判断条件是否满足,如果不满足则调用QWaitCondition的wait(),等待条件满足
  4. 满足条件的线程中,先获取QMutex来保护共享资源
  5. 修改条件,然后调用QWaitCondition的wakeOne()或者wakeAll(),唤醒等待的线程
  6. 被唤醒的线程再次获取QMutex,判断条件是否满足
  7. 如果条件满足则继续执行,否则继续等待

示例:

       在这个示例中,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();
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值