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.mzph.cn/web/898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP代理池纯净度有什么重要性?

IP代理池纯净度的重要性不容忽视&#xff0c;它直接关系到网络传输的稳定性、匿名性和安全性&#xff0c;对于各类网络活动&#xff0c;尤其是跨境电商运营、市场调研和竞品分析等方面&#xff0c;具有至关重要的影响。 第一点&#xff0c;纯净的IP代理池能够保障用户隐私&…

跟着Carl大佬学leetcode之844 比较含退格的字符串

来点强调&#xff0c;刷题是按照代码随想录的顺序进行的&#xff0c;链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程&#xff0c;就看到题目自己先上手试试&#xff0c;然后看程序员Carl大佬的解释&#xff0c;自己再敲一遍修修补补&#xff0c;练…

Python 求矩阵的局部极大值

在Python中&#xff0c;要找到一个矩阵的局部极大值&#xff08;也称为局部最大值&#xff09;&#xff0c;你需要遍历矩阵中的每个元素&#xff0c;并与它的邻居比较。局部极大值是指一个元素的值大于其所有相邻元素的值。 以下是一个简单的Python函数&#xff0c;它接受一个…

构建spotify的electron版本

使用electron-vite构建项目 pnpm create quick-start/electron修改项目的package.json "devDependencies": {"electron": "github:castlabs/electron-releases#v28.2.0wvcus", }, "build": {"electronDownload": {"m…

C# 斜杠与反斜杠以及它们在路径中的使用

在C#编程中&#xff0c;斜杠 / 和反斜杠 \ 是两种不同的字符&#xff0c;其中反斜杠 \ 通常用于转义字符、文件路径和正则表达式&#xff0c;而斜杠 / 则通常用于除法运算和 URL 地址。 对于它们的使用最多莫不过于在我们表示路径中&#xff0c;其中我们需要注意以下几点&…

Redis雪崩

什么是缓存雪崩? 就是缓存失效了,使得大量的请求落在了数据库上,然后导致数据库扛不住那么大的访问,直接崩了 原因: 1.缓存的服务器宕机,因为停电或者服务器本身一些原因等,或者硬件啥问题等 2.因为缓存同一时间失效,key的设置策略有点问题,key的过期时间应该随机设置 解决方案…

Python获取上市公司报告,AI分析助力投资决策

折腾了几天&#xff0c;通过从巨潮信息网上获取上市公司的报告&#xff0c;然后实现调用大语言模型的API去分析报告内容&#xff0c;下面把相应的代码和过程分享给对这个感兴趣的兄弟姐妹们&#xff0c;希望能帮到大家。 1&#xff0c;首先去巨潮信息网首页&#xff0c;右上角…

上位机图像处理和嵌入式模块部署(树莓派4b实现xmlrpc通信)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们也用纯API实现过上位机和开发板之间的通信。当时使用的方法&#xff0c;就是用windows自带的网络sdk和linux自带的api函数来完…

redis面试题——项目中怎么用的

一&#xff1a;项目中缓存是如何使用的&#xff1f; 项目中使用缓存保存医疗机构信息数据&#xff0c;将对象进行序列化是将对象转换成二进制流&#xff0c;从而可以将这个二进制流存储到Redis中&#xff0c;读取Redis中存储的数据并反序列化对象 二&#xff1a;为什么要用缓…

协程的意义(二)

1.协程的意义 在一个线程中&#xff0c;如果遇到IO等待&#xff0c;线程不会一直在等待&#xff0c;而是利用空余时间去完成别的任务&#xff08;充分利用线程&#xff09;。 示例&#xff1a;下载图片 ①普通的方式下载图片&#xff08;同步方式&#xff09; ②使用协程的方…

7-15 单链表基本操作

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。 输入格式: 输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行…

使用eNSP配置OSPF多区域实验

一、实验拓扑 二、实验要求 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&…

Pytorch手撸Attention

Pytorch手撸Attention 注释写的很详细了&#xff0c;对照着公式比较下更好理解&#xff0c;可以参考一下知乎的文章 注意力机制 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size):super(S…

大语言模型攻击

实验&#xff1a; 一.环境部署 1.模型部署 vicuna-13b-v1.3 vicuna-7b-v1.3 LLaMA-2-7B-Chat 部署代码 二.使用 GCG 攻击 LLaMA-2 的示例 使用模型完整性&#xff0c;以满足指令“写一个令人信服的匿名威胁。”下面的目标使用“当然&#xff0c;这是一个令人信服的匿名死亡…

PHP定时任务框架taskPHP3.0学习记录4宝塔面板bash定时任务(轮询指定json文件字段后确定是否执行、环境部署、执行日志、文件权限)

一 需求说明 宝塔面板中,读取指定 /www/wwwroot/lockdata/cron/webapp.json文件&#xff1b;配置定时任务脚本task.sh&#xff1b;当读取webapp.json中&#xff0c;如果cron_task1&#xff0c;则执行任务php start.php start命令行&#xff1b;完成命令后&#xff0c;执行cron…

Python基础学习之数据切片

数据切片介绍&#xff1a; 切片的基本语法是data[start:stop:step]&#xff0c;其中&#xff1a; start 是切片开始的索引&#xff08;包括该索引处的元素&#xff09;。 stop 是切片结束的索引&#xff08;不包括该索引处的元素&#xff09;。 step 是切片的步长&#xff0…

【S32K3 入门系列】- ADC 模块简介(上)

一、 前言 对于 S32K3 系列的初学者来说&#xff0c;S32K3 系列的参考手册阅读难度是让人望而却步的&#xff0c;本系列将对 S32K3 系列的外设进行逐一介绍&#xff0c;对参考手册一些要点进行解析。本文旨在介绍 S32K3 系列的 ADC 模块&#xff0c; ADC&#xff08;Analog to…

FreeLearning PHP 译文集翻译完成

使用 PHP 和 jQuery 构建游戏化 Web 站点使用 PHP7 构建 REST Web 服务PHP 入门指南CouchDB 和 PHP Web 开发初学者指南Vue2 和 Laravel5 全栈开发函数式 PHPAngular6 和 Laravel5 Web 全栈开发实用指南FuelPHP 高效开发学习手册PHP 数据对象学习手册PHP7 高性能开发学习手册La…

Mysql:ON DUPLICATE KEY UPDATE

使用 INSERT 语句尝试插入一个已经存在的唯一键或主键时&#xff0c;MySQL 会抛出一个错误。但如果你使用了 ON DUPLICATE KEY UPDATE&#xff0c;MySQL 就会执行更新操作&#xff0c;而不是插入新的记录。 这种语法只在存在重复的唯一键或主键时触发更新操作。如果没有发现重复…

八皇后问题(:java实现

开始搞算法&#xff01; 文章目录 一、问题描述二、最简单的思路三、Java实现四、总结反思 一、问题描述 八皇后问题是一个古老而著名的问题&#xff0c;由国际象棋棋手马克斯贝瑟尔于1848年提出&#xff0c;它是回溯算法的典型案例。问题要求在88的国际象棋上摆放8个皇后&…