• 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并发出信号后,消费者线程会被唤醒,并输出"消费者收到信号,开始消费"的信息。

    1. #include
    2. #include
    3. #include
    4. #include
    5. QWaitContion condition;
    6. QMutex mutex;
    7. bool isReady = false;
    8. class ProducerThread : public QThread
    9. {
    10. public:
    11. void run() override
    12. {
    13. qDebug("ProducerThread>>>>>>>");
    14. QThread::sleep(2);
    15. QMutexLocker locker(&mutex);
    16. isReady = true;
    17. condition.wakeOne();
    18. }
    19. };
    20. class ConsumerThread : public QThread
    21. {
    22. public:
    23. void run() override
    24. {
    25. qDebug(">>>>>>>ConsumerThread");
    26. QMutexLocker locker(&mutex);
    27. while(!isReady){
    28. condition.wait(&mutex);
    29. }
    30. qDebug() << "消费者收到信号,开始消费";
    31. }
    32. };
    33. int main(int argc, char *argv[])
    34. {
    35. QCoreApplication a(argc, argv);
    36. ProducerThread producerThread;
    37. ConsumerThread consumerThread;
    38. consumerThread.start();
    39. producerThread.start();
    40. consumerThread.wait();
    41. producerThread.wait();
    42. return a.exec();
    43. }

  • 相关阅读:
    【23种设计模式】享元模式【⭐】
    4.整合第三方技术【整合JUnit】
    视频融合技术平台解决方案
    学习PS的个人笔记:掌握基本技能和高级应用
    protobuf 版本问题 #error regenerate this file with a newer version of protoc.
    网络攻击肆虐,高校如何构筑网络安全屏障?
    Guitar Pro 8win10最新版吉他学习 / 打谱 / 创作
    码蹄集 - MT3251 - 多重回文
    Java项目:SSM汽车维修中心管理系统
    Java语言的基础
  • 原文地址:https://blog.csdn.net/baidu_33879812/article/details/133942255