当前位置: 首页 > news >正文

QT之QSharedMemory共享内存

QSharedMemory是qt提供对共享内存操作的类,主要用来对内存卡写数据和读数据。

常用api:

1、void QSharedMemory::setKey(const QString &key)

为共享内存设置键值。如何当前的内存共享对象已经链接到底层的共享内存段(isAttached),则在设置新的键值前分离开(detach)

2、bool QSharedMemory::create(int size, QSharedMemory::AccessMode mode = ReadWrite)
该函数根据共享内存的Key值来创建一个size大小的共享内存段,可以根据mode设为ReadWrite可读可写或者ReadOnly只读模式。

3bool QSharedMemory::attach(QSharedMemory::AccessModemode= ReadWrite)该函数将会依据共享内存对象的Key值,来将共享内存对象与实际的共享内存逻辑地址相链接,这样进程就可以通过QSharedMemory对象来访问实际的共享内存了。4、bool QSharedMemory::detach()
将进程与共享内存段分离。如果这是链接到共享内存段的最后一个进程,那么这个共享内存段将被系统释放,也就是说,共享内存中的内容将被销毁。
5bool QSharedMemory::lock()
这是一个可以锁住共享内存段以供该进程访问的信号量。当进程对共享内存进程操作时,为防止其它进程也对该内存进行改动从而操作数据不同步的情况,需要将内存进行锁定,也就是lock。6、bool QSharedMemory::unlock()
当对共享内存操作完成后,需要释放共享内存段上的锁。否则其它进程无法对共享内存进行任何操作。发送端代码:

void QtWidgetsSendData::writeSharedMemory(QImage img)

{

    if (mSharedMemSender == nullptr)

    {

        mSharedMemSender = new QSharedMemory();

        // 设置共享内存区域Key

        mSharedMemSender->setKey("PicShared");

        if (mSharedMemSender->isAttached())

        {

            mSharedMemSender->detach();

        }

        // 获取需要共享的数据大小

        int r = mSharedMemSender->size();

        // 创建共享内存区域

        auto hh = mSharedMemSender->create(588810);

    }

  

  

    QBuffer buffer;

    buffer.open(QIODevice::ReadWrite);

    // 创建QDataStream对象并指定数据存储对象为buffer

    QDataStream inStream(&buffer);

    // 将图片数据传入

    inStream << img;

  

    // 将共享内存区域锁定

    mSharedMemSender->lock();

    //写入数据

    memcpy((char*)mSharedMemSender->data(), (char*)buffer.data().data(), buffer.size());

    // 将共享内存区域解锁

    mSharedMemSender->unlock();

}

 
 
接受端代码:

void QtWidgetsReceiveData::readSharedMemory()

{

    QSharedMemory sharedMemReceiver;

    // 设置共享内存区域Key

    sharedMemReceiver.setKey("PicShared");

    // 将共享内存区域与程序挂接

    int rr = sharedMemReceiver.isAttached();

    int r = sharedMemReceiver.attach();

    auto test = sharedMemReceiver.errorString();

    //qDebug() << "创建共享内存失败: " << sharedMemReceiver.errorString();

    // 将共享内存区域锁定

    sharedMemReceiver.lock();

    // 获取共享内存大小(此处相当于数据大小)

    int size = sharedMemReceiver.size();

    QBuffer buffer;

    // 将共享内存的数据设置到buffer容器中

    buffer.setData((char*)sharedMemReceiver.constData(), size);

    // 然后以只读的方式打开

    buffer.open(QBuffer::ReadOnly);

    // 创建QDataStream对象读取数据,并指定数据buffer

    QDataStream outStream(&buffer);

    // 创建QImage并通过数据流对象将图片数据写入

    QImage img;

    outStream >> img;

    // 将共享内存解锁

    sharedMemReceiver.unlock();

    // 将挂接的共享内存与程序分离

    sharedMemReceiver.detach();

    ui.label_srcImage->setPixmap(QPixmap::fromImage(img));

}

 

相关文章:

QT之QSharedMemory共享内存

QSharedMemory是qt提供对共享内存操作的类&#xff0c;主要用来对内存卡写数据和读数据。 常用api: 1、void QSharedMemory::setKey(const QString &key) 为共享内存设置键值。如何当前的内存共享对象已经链接到底层的共享内存段&#xff08;isAttached&#xff09;&…...

string 类 经典习题之数字字符相加

题目&#xff1a; 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 题目来源&#xff1…...

通讯录——C语言实现

头文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一个人的信息 //struct…...

优思学院|3步骤计算出Cpk|学习Minitab

在生产和质量管理中&#xff0c;准确了解和控制产品特性至关重要。一个关键的工具是Cpk值&#xff0c;它是衡量生产过程能力的重要指标。假设我们有一个产品特性的规格是5.080.02&#xff0c;通过收集和分析过程数据&#xff0c;我们可以计算出Cpk值&#xff0c;进而了解生产过…...

【Java编程进阶之路 06】深入探索:JDK、JRE与JVM的关系与差异

JDK、JRE与JVM&#xff1a;揭开Java运行环境的神秘面纱 在Java开发者的日常工作中&#xff0c;JDK、JRE和JVM这三个概念是不可或缺的。它们构成了Java应用程序的运行环境&#xff0c;但很多初学者可能对这三者的关系和差异感到困惑。本文旨在详细解析JDK、JRE和JVM之间的关系&…...

Linux中的touch命令

在Linux中&#xff0c;​touch​命令主要用于创建空的文件或者更新已存在文件的时间戳。下面是 ​touch​命令的使用方式和示例说明&#xff1a; 创建空文件 要创建一个空文件&#xff0c;可以使用 ​touch​命令并指定文件名&#xff0c;如下所示&#xff1a; touch new_fi…...

智能驾驶规划控制理论学习-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…...

二叉树——二叉树所有路径

二叉树所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","1-…...

算法训练营day38(补),动态规划6

package main func max(a, b int) int { if a > b { return a } return b } 背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品1320物品2430 每件商品都有无限个&#xff01; 问背包能背的物品最大价值是多少&#xff1f; func package03(weight, value []…...

【java、微服务、nacos】nacos服务分级存储模型

Nacos服务分级存储模型 ① 一级是服务&#xff0c;例如userservice ②二级是集群&#xff0c;例如杭州或上海 ③ 三级是实例&#xff0c;例如杭州机房的某台部署了userservice的服务器 配置实例集群属性 改变服务的yml文件 spring:cloud:nacos:discovery:cluster-name: H…...

共享旅游卡:打开0费用旅游新纪元,探索40+精彩线路

随着现代生活节奏的加快&#xff0c;旅游成为了许多人释放压力、寻求乐趣的方式。然而&#xff0c;面对琳琅满目的旅游线路和不断上涨的旅游费用&#xff0c;许多人望而却步。 今天&#xff0c;我们要为您介绍一种颠覆传统旅游方式的创新产品——共享旅游卡。它不仅能让您以0费…...

MQTT协议解析:揭秘固定报头、可变报头与有效载荷的奥秘

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种轻量级的通讯协议&#xff0c;常用于远程传感器和控制设备的通讯。MQTT协议基于发布/订阅模式&#xff0c;为大量计算能力有限且工作在低带宽、不可靠网络环境中的设备…...

备战蓝桥杯---树形DP基础3

上一次我们讲了二叉苹果树&#xff0c;现在我们加一点难度&#xff0c;从二叉变成了多叉苹果树。 这样子我们就不可以直接按照上次的方法DP&#xff0c;我们其实可以发现&#xff0c;我们可以用类似背包的思想求解&#xff0c;这就是所谓的树上背包。 我们先加进第一个儿子来…...

IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知

一、背景 兔年末投了一篇TIE&#xff0c;手稿初次提交的注意事项也整理成了博客IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知&#xff0c;获得了许多点赞和收藏。最近也收到了审稿结果&#xff0c;给的意见是大修major revision&#xff0c;总之只要不…...

c#委托的三种实现方式

委托是实质一个类&#xff0c;主要目的是将方法当作参数进行传递。 委托是.NET编程的精髓之一&#xff0c;在日常编程中经常用到&#xff0c;在C#中实现委托主要有Func、Action、delegate三种方式&#xff0c;本节主要就这三种委托的用法通过实例展开讲解。 Func用法解析 【F…...

c/c++|红黑树|分析应用|锚点

红黑树是一种自平衡的二叉查找树&#xff0c;它保持着良好的平衡&#xff0c;能够在插入和删除等操作后通过一系列旋转和重新着色操作来保持树的平衡。这种平衡性质使得红黑树在搜索、插入和删除等操作的平均和最坏情况下的时间复杂度都是O(log n)。以下是红黑树的一些关键特性…...

2-29算法习题总结

贪心问题 小A的糖果 题目描述 小 A 有 n n n 个糖果盒&#xff0c;第 i i i 个盒中有 a i a_i ai​ 颗糖果。 小 A 每次可以从其中一盒糖果中吃掉一颗&#xff0c;他想知道&#xff0c;要让任意两个相邻的盒子中糖的个数之和都不大于 x x x&#xff0c;至少得吃掉几颗糖…...

当Linux 磁盘满了,查看大文件并删除

当你的Linux磁盘空间满了时&#xff0c;可以通过以下步骤查找大文件并删除它们&#xff1a; 检查磁盘空间&#xff1a; 使用以下命令检查磁盘空间的使用情况&#xff1a; df -h这将显示文件系统的使用情况&#xff0c;包括每个文件系统的总大小、已用空间、可用空间和挂载点。 …...

STL -萃取特性迭代器

1. STL简单概述 a. STL六大组成部分 容器&#xff08;Container&#xff09;空间配置器&#xff08;allocator&#xff09;算法&#xff08;Algorithm&#xff09;迭代器&#xff08;Iterator&#xff09;仿函数&#xff08;Function object&#xff09;适配器&#xff08;Ad…...

python pandas写入csv

在Python的Pandas库中&#xff0c;可以使用to_csv方法将DataFrame对象写入CSV文件。以下是一个简单的示例&#xff1a; import pandas as pd# 创建一个DataFrame对象 data {Name: [Alice, Bob, Charlie, David],Age: [25, 30, 35, 40],City: [New York, Los Angeles, Chicago…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...