QT QThread +信号量 实现生成者和消费者

//本文详细描述QT 中QThread +信号量 实现生成者和消费者。

//调试通过。

//这个例子演示了怎样使用QSemaphore 信号量来保护对生成者线程和消费者线程共享的环形缓冲

//区的访问。
//生成者向缓冲区中写入数据,直到达到缓冲区的终点,这时它会从起点重新开始,覆盖已经存在

//的数据
//消费者线程读取它产生的数据,并将其输出。
//这个例子中包含Producer和Consumer类,它们都继承自QTherad
//环形缓冲区用来在这两个缓冲区通讯,保护缓冲区的信号量被设置为全局变量

//---------------------------------------------------------------------

//1.main 文件

#include <QCoreApplication>
#include <QSemaphore>
#include "producer.h"
#include "consumer.h"
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"start";
    Producer producer;
    Consumer consumer;
    /* 启动生产者和消费者线程 */
    producer.start();
    consumer.start();
    /* 等待生产者和消费者各自执行完毕后自动退出 */
    producer.wait();
    consumer.wait();

    qDebug()<<"end";
    return a.exec();
}

//---------------------------------------------------------------------

//---------------------------------------------------------------------

//2.全局变量

//2.1全局变量头文件

#include <QSemaphore>
#ifndef GLOBAL_DEF_H
#define GLOBAL_DEF_H
extern const int DataSize;//生产者将要产生数据的数量
extern const int BufferSize;//环形缓冲区的大小
extern char buffer [];//缓冲区
extern QSemaphore freeBytes;//控制缓冲区的空闲区域(生成者还没添加数据或者消费者已经进

//行读取的区域)
extern QSemaphore usedBytes;//控制已经使用了的缓冲区区域(生成者已经添加数据,但是消费

//者还没有读取的区域)
#endif // GLOBAL_DEF_H

//---------------------------------------------------------------------

//2.2 全局变量cpp文件

#include "global_def.h"
const int DataSize=10;//生产者将要产生数据的数量
const int BufferSize=5;//环形缓冲区的大小
char buffer [BufferSize];//缓冲区
QSemaphore freeBytes(BufferSize);//控制缓冲区的空闲区域(生成者还没添加数据或者消费者已经进行读取的区域)
QSemaphore usedBytes(0);//控制已经使用了的缓冲区区域(生成者已经添加数据,但是消费者还没有读取的区域)
//这两个信号保证了生成者永远不会在消费者前多于BufferSize个字节,而消费者永远也不会读取生成者还没生成的数据

//---------------------------------------------------------------------

//---------------------------------------------------------------------
//3.生成者类

//3.1 生成者类头文件

#ifndef PRODUCER_H
#define PRODUCER_H
#include <QThread>
#include "global_def.h"
#include <QRandomGenerator>
#include <QDebug>
class Producer : public QThread
{
public:
     Producer();
     void run() ;//注意大小写,不是Run()函数
};
#endif // PRODUCER_H

//---------------------------------------------------------------------
//3.2 生成者类cpp文件

#include "producer.h"
Producer::Producer()
{}
void Producer::run()
{
    for(int i=0;i<DataSize;i++)
    {
        freeBytes.acquire();
        int randomInt = QRandomGenerator::global()->bounded(100);
        buffer[i % BufferSize] ="ACGT"[(int) randomInt % 4 ];
        qDebug()<<QString("producer:%1").arg(buffer[i % BufferSize]);

        usedBytes.release();
    }
}

//---------------------------------------------------------------------

//---------------------------------------------------------------------
//4. 消费者类 

//4.1 消费者类 头文件

#ifndef CONSUMER_H
#define CONSUMER_H

#include <QThread>
#include <QDebug>
#include "global_def.h"
class Consumer : public QThread
{
public:
    Consumer();
     void run() ;//注意大小写,不是Run()函数
};
#endif // CONSUMER_H

//---------------------------------------------------------------------
//4.2 消费者类 cpp文件

#include "consumer.h"

Consumer::Consumer()

{}
void Consumer::run()
{
    for(int i=0;i<DataSize;i++)
    {
        usedBytes.acquire();
        qDebug()<<QString("consumer:%1").arg(buffer[i % BufferSize]);
        freeBytes.release();
    }
}

//---------------------------------------------------------------------

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

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

相关文章

各大厂都推出鸿蒙APP了,你就一定要学习一下鸿蒙APP测试了!

2023年8月&#xff0c;华为推出鸿蒙4.0&#xff0c;由于其广泛的用户基础和品牌传播力&#xff0c;在短短几个月的时间&#xff0c;使用鸿蒙4.0系统的设备就达到千万级别&#xff0c;并且在9月份发售Mate 6之后&#xff0c;还在装机量的增长更加迅猛。 基于此&#xff0c;11月…

AMD新一代AI PC芯片惊艳登场!颠覆商业计算领域!

AMD发布新一代AI PC芯片 前言 就在北京时间4月17日&#xff0c;AMD正式面向商业计算领域推出新一代AI PC创新产品&#xff01;他们宣布推出锐龙Pro 8040系列和AMD锐龙Pro 8000系列&#xff0c;扩展其商用移动和桌面AI个人电脑&#xff08;PC&#xff09;产品组合。 了解PRO 804…

【Vue3】setup语法糖的使用

文章目录 setup简介使用vite-plugin-vue-setup-extend插件 指定组件名字 setup简介 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖 相比较普通的<script> ,它有以下优势&#xff1a; 更少的样板内容&#xff0c;更简洁的代码。能够使用纯…

基于SpringBoot的“人职匹配推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“人职匹配推荐系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 网上商城购物系统结构图 管理员登录界面图 个…

flask 应用程序

flask 程序示例 创建 hello.py 文件&#xff1a; # 导入 Flask 模块。Flask 类的一个对象是 wsgi 应用程序。 from flask import Flask# 创建app对象, Flask构造函数将当前模块的名称(__name__)作为参数。 app Flask(__name__)# route() 函数是一个装饰器&#xff0c;它告诉应…

【UE5.1】使用MySQL and MariaDB Integration插件——(3)表格形式显示数据

在上一篇&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;2&#xff09;查询&#xff09;基础上继续实现以表格形式显示查询到的数据的功能 效果 步骤 1. 在“WBP_Query”中将多行文本框替换未网格面板控件&#xff0c;该控件可以用表格形式布局…

vr兽医设备操作模拟仿真教学平台提升教学效果

在兽医教育的传统领域中&#xff0c;动物诊疗一直是一项不可或缺的实践环节。然而&#xff0c;传统的解剖教学方式受限于动物数量、种类以及安全隐患&#xff0c;无法充分满足学生的学习需求。随着VR虚拟仿真技术的不断精进&#xff0c;VR动物诊疗仿真实训系统为兽医教育带来了…

【训练营】DateWhale——动手学大模型应用开发(更新中)

文章目录 写在前面大模型简介LLM简介RAG简介LangChain开发框架开发LLM应用的整体流程 写在前面 大模型时代从GPT爆发开始到现在已有一年多了&#xff0c;深度学习发展之快无法想象&#xff0c;一味感叹技术发展速度超越个人学习速度是没用的&#xff0c;倒不如花点时间参加一些…

Linux之 USB驱动框架-USB总线核心和主控驱动(4)

一、USB设备描述符 一个USB设备描述符中可以有多个配置描述符&#xff0c;即USB设备可以有多种配置&#xff1b;一个配置描述符中可以有多个接口描述符&#xff0c;即USB设备可以支持多种功能&#xff08;接口&#xff09;&#xff1b;一个接口描述符中可以有多个端点描述符。 …

5个常见的前端手写功能:New、call apply bind、防抖和节流、instanceof、ajax

实现New 首先创建一个新的空对象设置原型&#xff0c;将对象的原型设置为函数的prototype对象让函数的this指向这个对象&#xff0c;执行构造函数的代码判断函数的返回值类型&#xff0c;如果是值类型&#xff0c;返回创建的对象。如果是引用类型&#xff0c;就返回这个引用类…

网站创建的流程是什么

网站的创建过程包括几个主要的步骤&#xff0c;其中涉及到一系列的决策和实践操作。下面我将详细介绍网站创建的流程&#xff0c;帮助读者了解如何创建一个成功的网站。 第一步&#xff1a;确定网站目标和功能 在创建网站之前&#xff0c;你需要明确自己网站的目标和功能。是用…

nodejs中使用node-addon-api框架:本地子线程调用JS代码

文章目录 JS代码中使用worker的方式main.jsapp.jsC本地代码基本框架环境变量napi_envreference,引用给传入C本地方法的JS函数增加引用在线程函数t_method2中获得引用函数对象并调用HandleScope::HandleScope错误scope还是行不通NODE-ADDON-API的方式

【剪映专业版】07素材导入与界面认识

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 点击开始创作后生成新的草稿 单击更改草稿名称 导入数量没有限制 根据选中素材创建文件夹&#xff1a;选中素材&#xff0c;单击右键 智能镜头分割&#xff1a;选中素材&#xff0c;单击右键&#xff0c;用于不同场景…

【Git】安装 Git

文章目录 1. CentOS 下安装2. Ubuntu 下安装 Git 是开放源代码的代码托管工具&#xff0c;最早是在 Linux 下开发的。开始也只能应用于 Linux 平台&#xff0c;后面慢慢的被移植到 Windows 下。现在&#xff0c;Git 可以在 Linux、Unix、Mac 和 Windows 这几大平台上正常运行了…

SA8000认证资讯--申请流程

SA8000认证流程 SA8000认证流程的第一步是申请组织参加管理体系在线自我评估。Social Fingerprint自我评估可以帮助该组织了解 SA8000管理体系要求并判断是否已做好认证申请准备。当该组织认为其管理实践足够成熟&#xff0c;具备认证条件时&#xff0c;可以从20 多家独立的SAA…

力扣2923、2924.找到冠军I、II---(简单题、中等题、Java、拓扑排序)

目录 一、找到冠军I 思路描述&#xff1a; 代码&#xff1a; 二、找到冠军II 思路描述&#xff1a; 代码&#xff1a; 一、找到冠军I 一场比赛中共有 n 支队伍&#xff0c;按从 0 到 n - 1 编号。 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足…

后端开发简介

后端开发是软件开发领域的一个重要组成部分&#xff0c;主要负责构建和维护应用程序的服务器端逻辑、数据处理、系统架构和基础设施。后端开发人员通常专注于处理那些用户看不到但对应用程序功能至关重要的部分&#xff0c;确保数据的安全存储、高效检索、业务逻辑的正确执行以…

基于springboot的甘肃非物质文化网站源码数据库

基于springboot的甘肃非物质文化网站源码数据库 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本甘肃非物质文化网站就是在这样的大环境下诞生&#xff0…

迁移学习入门

参考文献 [1]迁移学习与领域自适应&#xff1a;如何让模型更好地适应新的任务 [2]迁移学习与多模态数据处理的结合与应用 [3]Domain Adaptation&#xff08;领域自适应&#xff0c;MMD&#xff0c;DANN&#xff09; [4]迁移学习与多模态学习&#xff1a;实现跨模态知识传递 [5…