QT c++ QWaitCondition 线程等待条件

30 篇文章 0 订阅

        本文描述,QT  c++  QWaitCondition  线程等待条件,在文章后面列出了参考代码下载链接

        如果不用它,可能需要通过定时循环检查某个变量的值满足条件,执行相应的代码,程序空跑,占用CPU资源。

        而且定时循环并不能满足所有需要,比如线程A负责采集数据序列或者叫数组,线程B负责汇集序列,那么用定时循环,则会出现比实际的多或者少的情况,出现的频次不一定很高,但不好检查问题原因。

        又有些人会说,那线程A负责采集同时汇集不就行了。是的,能合在一个线程没有此bug。

        但有些情况不能合在一个线程,一是采集数据序列有严苛的时间要求,二是线程B不仅仅要汇集也要进行数据处理、显示、存储、查询等,放在一起违背了功能分离的原则,代码也难以维护。

        打个比方,你能让矿石开采、冶炼都放在一个矿山吗,能把米厂放在稻田吗,居民家里能做个电厂吗。数据也像工厂一样,有它相应的数据链条,一级一级传输

       以上说了那么多,用QT  QWaitCondition是一种办法,它告知数据消费线程,有新数据了,是时候收集数据了。要让现场B先启动,等待条件变量满足,执行数据汇集处理等,条件不满足则进入睡眠等待状态,不会往下执行,卡在wait()语句这一行。如果不让线程B先启动,可能造成遗漏。

        另外,本文代码还用到了读写锁,显而易见的,写的时候不能读,读的时候不能写,但是可以有多个读,读写锁用来保证只有1个线程在写,没有线程在写的时候,可以有多个线程在同时读。QT的读写锁类名称是QReadWriteLock。

        而且,本文,代码还示意了互斥QMutex。

    //talk is cheap,下面是代码

1.全局定义

1.1全局定义头文件

#ifndef GLOABAL_DEF_H
#define GLOABAL_DEF_H
#include <QReadWriteLock>
#include <QWaitCondition>
#include <QMutex>
extern QReadWriteLock lock;
extern QMutex mutex;
extern int sharedData;
extern QWaitCondition condition;
#endif // GLOABAL_DEF_H

1.2全局定义cpp文件

#include "gloabal_def.h"
QReadWriteLock lock;
QMutex mutex;
int sharedData = 0;
QWaitCondition condition;
2.线程A

2.1线程A头文件

#ifndef THREADA_H
#define THREADA_H
#include <QThread>
#include "gloabal_def.h"
class ThreadA:public QThread
{
public:
    ThreadA();
    void run();
};
#endif // THREADA_H
2.2线程A cpp文件

#include "threada.h"
ThreadA::ThreadA() {}
void ThreadA::run()
{
    while(1)
    {
        lock.lockForWrite(); // 获取写锁
        //mutex.lock();//和上行等效
        sharedData++;
        condition.wakeAll();//唤醒线程B
        lock.unlock();// 释放锁

        //mutex.unlock();//和上行等效
        QThread::msleep(300);
    }
}

3.线程B

3.1线程B头文件

#ifndef THREADB_H
#define THREADB_H
#include <QThread>
#include "gloabal_def.h"
#include <QDebug>
class ThreadB:public QThread
{
public:
    ThreadB();
    void run();
};
#endif // THREADB_H

3.2线程B cpp文件

#include "threadb.h"
ThreadB::ThreadB() {}
void ThreadB::run()
{  while(1)
    {
        int value;
        lock.lockForRead(); // 获取读锁,
        //mutex.lock();//和上行等效
          condition.wait(&lock);//等待线程条件满足,否则线程睡眠

          //condition.wait(&mutex);//和上行等效
          value = sharedData;
     
         lock.unlock();

          //mutex.unlock(); // 释放锁,和上行等效
        qDebug()<<value;
        //QThread::msleep(90);
    }
}

4.main函数

#include <QCoreApplication>
#include "threada.h"
#include "threadb.h"
// #include "gloabal_def.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ThreadA thread1;
    ThreadB thread2;
    thread2.start();//线程要比线程A先启动
    thread1.start();

    thread1.wait();
    thread2.wait();
    return a.exec();
}

5.代码下载链接

https://download.csdn.net/download/weixin_39926429/89171951

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值