QT c++ QWaitCondition 线程等待条件

        本文描述,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/559170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架&#xff0c;在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&…

如何使用 Cloudflare 和 Mailgun 设置自定义电子邮件

作为一名软件工程师&#xff0c;您可能考虑拥有一个专业的电子邮件账户&#xff0c;以及自己的网站&#xff0c;比如 “infoexample.com”. 但这可能会花费一定金额&#xff0c;您可能不愿意支付。 但您知道您可以免费做到吗&#xff1f;事实上&#xff0c;有一种方法可以做到…

error解决expression before ‘static‘

问题现象 报警如下 跳转到提示第125行&#xff0c;但是这行明显是没有问题的。 问题分析 经过排查可以看到&#xff0c;是120行的末尾\在S32DS编译器里面被认为是“接下一行”的意思&#xff0c;120行注释掉之后&#xff0c;后面的121行、122行、123行均被注释掉&#xff0c;…

得物sign参数逆向分析与Python算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. Python算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚…

bp神经网络拟合函数未知参数【源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

Linux 操作系统非缓冲区的文件操作、时间编程

1、文件操作 1.1 基于缓冲区的文件操作 基于缓冲区的文件操作---高级Io 以f开头的是基于缓冲区的文件操作 printf是一个基于缓冲区的函数 输出条件&#xff1a; 1.程序正常运行 2.遇到换行\n也能输出 3.缓存区内存已满 1024大小 4.遇到fflush&#xff08;stdout&a…

Ansible-变量-迭代-jinja2模版

变量&#xff1a; 在ansible中&#xff0c;变量是用来存储和传递数据的容器。 这些变量可以包含各种类型的数据&#xff0c;列如数字、字符串、列表、字典。 可以增加ansible playbook的灵活性和重用性变量的使用&#xff1a; 声明&#xff1a;变量名值 引用&#xff1a;{{ 变量…

详细分析Java中的AuthRequest类(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 公共接口&#xff0c;定义了对第三方平台进行授权、登录、撤销授权和刷新 token 的操作 1. 基本知识 先看源码基本API接口&#xff1a; import me.zhyd.oauth.enums.AuthResponseStatus; import me.zhyd.oauth.exception.AuthExce…

提升测试效率,专业方案揭秘

提升测试效率是软件开发中一个永恒的主题&#xff0c;它不仅关乎项目能否按期完成&#xff0c;更影响着软件产品的质量与用户体验。随着敏捷开发、持续集成等方法论的普及&#xff0c;如何在有限的时间内进行高效、全面的测试成为了开发者和测试人员面临的挑战。 在传统模式中&…

Windows 平台上面管理服务器程式的高级 QoS 策略

在 Windows 平台上面&#xff0c;目前有两个办法来调整应用程式的 QoS 策略设置&#xff0c;一种是通过程式设置&#xff0c;一种是通过 “Windows 组策略控制”。 在阅读本文之前&#xff0c;您需要先查阅本人以下的几篇文献&#xff0c;作为前情提示&#xff1a; VC Windows…

数据质量与策略:解锁生成式AI潜力的关键步骤

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

每日一题(L2-011):玩转二叉树--建树+层序遍历

与L2-006近乎相同&#xff0c;先建树&#xff0c;然后遍历 #include<bits/stdc.h> using namespace std; int in[35]; int pre[35]; typedef struct Tree{int num;Tree* left;Tree* right; }T;T * build(int in1,int in2,int pre1,int pre2){T * tnew T;t->numpre[pr…

战姬物语部署

一.准备环境 #关闭seliunx和防火墙 setenforce 0 systemctl stop firewalld systemctl disable firewalld #配置源&#xff0c;并安装常用工 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo …

Leetcode 86. 分隔链表

题目链接&#xff1a; 86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/partition-list/description/ 题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出…

深入探究图像增强(C语言实现)

我们将从基础出发使用C语言进行图像处理与分析&#xff0c;重点讨论图像增强和平滑技术。图像增强技术旨在通过增加对比度、亮度和整体清晰度来改善图像的视觉质量。另一方面&#xff0c;图像平滑方法则用于减少噪声并减少图像中的突变&#xff0c;使图像更加均匀和视觉上吸引人…

利用二维码定位技术实现桌面机器人简易定位方案(上篇)

目录 1、前言2、二维码的定位标签识别原理3、生成定位标签3、基于定位标签的物体识别与定位 1、前言 机械手臂尤其是工业场景下大部分的应用是在一个平面&#xff08;桌面&#xff09;内完成一些抓取工作。一般可以用示教方式完成重复步骤。但是示教方式&#xff0c;对于一些活…

过氧化氢滴定方法可用的PFA器皿有哪些?

滴定液:KMnO4标准溶液 试液:H2O2商品液(3%)&#xff0c;H2SO4 (3.0mol/L ) 指示剂:酚酞指示剂 仪器:分析天平&#xff0c;PFA酸式滴定管50mL&#xff0c;PFA 移液管10mL/25mL、PFA 容量瓶250mL、PFA锥形瓶250mL 1、KMnO4标准溶液浓度的标定(见实验:高锰酸钾标准溶液的配制与…

记一次普通的单表查询sql优化,去掉文件排序

一现象&#xff1a; 有空观察了线上某个sql语句执行计划&#xff0c;发现在500多毫秒左右&#xff0c;打算进行下优化。 二步骤&#xff1a; 对查询列assessment_periodic_id、assessment_user_id、create_time添加了组合索引并指定了倒叙。加入create_time 使查询结果不需要在…

阿里云OSS 存储对象的注册与使用

目录 一、什么是阿里云OSS 二、 点击免费试用 2.1 选择第一个&#xff0c;点击免费试用 ​编辑 2.2 登录管理控制台 2.3 进入Bucket 2.4、在阿里云网站上的个人中心配置Accesskey,查询accessKeyId和accessKeySecret。 2.5、进入AccssKey管理页面应该会出现下图提示&…

通用大模型研究重点之五:llama family

LLAMA Family decoder-only类型 LLaMA&#xff08;Large Language Model AI&#xff09;在4月18日公布旗下最大模型LLAMA3&#xff0c;参数高达4000亿。目前meta已经开源了80亿和700亿版本模型&#xff0c;主要升级是多模态、长文本方面工作。 模型特点&#xff1a;采用标准的…
最新文章