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

034-QSharedMemory

QSharedMemory

以下为针对 QSharedMemory 的技术调研及实现方案,包含原理、优化策略、完整代码实现及流程图解:

一、QSharedMemory 核心原理

1.1 共享内存机制
共享内存流程图 (注:此处应为共享内存IPC流程图,因文本限制以伪代码描述流程)

进程A创建共享内存 -> 写入数据 -> 加锁同步 -> 进程B关联内存 -> 读取数据

1.2 跨平台特性差异

平台内存所有权崩溃处理机制
Windows内核自动回收进程退出后内存自动释放
LinuxQSharedMemory 持有需显式调用析构函数

二、关键技术实现

2.1 数据结构设计

// 定义共享内存头部元数据
struct SharedHeader {qint32 version;     // 数据版本号qint64 timestamp;   // 最后更新时间戳qint32 dataSize;    // 有效数据长度
};// 共享内存布局
+----------------+-------------------+
| SharedHeader   | Raw Data (图像/结构体) |
+----------------+-------------------+

2.2 核心代码实现

// 共享内存管理类(支持局部数据更新)
class SharedMemoryManager {
public:explicit SharedMemoryManager(const QString &key, QObject *parent = nullptr): QObject(parent), m_sharedMemory(key) {m_sharedMemory.setNativeKey(key);  // 设置跨平台标识[11]()}bool writeData(const QByteArray &data, int offset = 0) {if (!m_sharedMemory.isAttached()  && !attach()) return false;m_sharedMemory.lock(); char *to = static_cast<char*>(m_sharedMemory.data()); memcpy(to + offset, data.constData(),  data.size()); updateHeader(data.size(),  offset); // 更新元数据m_sharedMemory.unlock(); return true;}QByteArray readData(int offset, int size) {if (!attach()) return QByteArray();m_sharedMemory.lock(); const char *from = static_cast<const char*>(m_sharedMemory.constData()); QByteArray buffer(from + offset, size);m_sharedMemory.unlock(); return buffer;}private:bool attach() {if (m_sharedMemory.attach())  return true;const int totalSize = calculateTotalSize(); // 计算内存总大小if (!m_sharedMemory.create(totalSize))  {qDebug() << "Create failed:" << m_sharedMemory.errorString(); return false;}initializeHeader(); // 初始化元数据return true;}QSharedMemory m_sharedMemory;
};

三、性能优化策略

3.1 参数调优配置

// 在构造函数中配置优化参数
m_sharedMemory.setNativeKey("MyApp_SharedMem_v1.0");  // 唯一标识
m_sharedMemory.setAccessMode(QSharedMemory::ReadWrite);  // 读写模式

3.2 高级优化技术

  • 分页管理:将大内存划分为 4KB 页,实现局部更新
const int PAGE_SIZE = 4096; 
void updatePage(int pageNum, const QByteArray &data) {writeData(data, pageNum * PAGE_SIZE);
}
  • 双缓冲机制:使用两个内存段交替写入,避免读写冲突
QSharedMemory buffers[2]();
int currentBuffer = 0;
  • 错误恢复策略:
if (m_sharedMemory.error()  == QSharedMemory::NotFound) {m_sharedMemory.attach();  // 尝试重新关联
}

四、典型应用场景

4.1 全屏图像共享

// 写入端
QImage screenshot = grabScreen();
QBuffer buffer;
buffer.open(QIODevice::WriteOnly); 
screenshot.save(&buffer,  "PNG");
sharedManager.writeData(buffer.data()); // 读取端
QByteArray imgData = sharedManager.readData(sizeof(SharedHeader),  buffer.size()); 
QImage receivedImage;
receivedImage.loadFromData(imgData,  "PNG");

4.2 结构体数据同步

struct SensorData {double temperature;qint32 pressure;
};

// 写入结构化数据
SensorData data {25.6, 1013};
sharedManager.writeData(QByteArray::fromRawData(
reinterpret_cast<const char*>(&data), sizeof(data)));

五、最佳实践建议

  • 内存对齐:使用
#pragma pack(push, 1)

确保结构体跨平台兼容

  • 版本控制:在元数据中增加版本号,处理数据格式变更
  • 异常处理:
if (m_sharedMemory.error()  != QSharedMemory::NoError) {qCritical() << "Memory error:" << m_sharedMemory.errorString(); 
}

完整代码

Github

作者郑天佐
邮箱zhengtianzuo06@163.com
主页http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

相关文章:

034-QSharedMemory

QSharedMemory 以下为针对 QSharedMemory 的技术调研及实现方案&#xff0c;包含原理、优化策略、完整代码实现及流程图解&#xff1a; 一、QSharedMemory 核心原理 1.1 共享内存机制 共享内存流程图 &#xff08;注&#xff1a;此处应为共享内存IPC流程图&#xff0c;因文本…...

在 Ubuntu 上离线安装 Prometheus 和 Grafana

在 Ubuntu 上离线安装 Prometheus 和 Grafana 的步骤如下&#xff1a; 一.安装验证 二.安装步骤 1.准备离线安装包 在一台可以访问互联网的机器上下载 Prometheus 和 Grafana 的二进制文件。 Prometheus 下载地址&#xff1a;Prometheus 官方下载页面Grafana 下载地址&#…...

Ansible:playbook的高级用法

文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组&#xff08;公共&#xff09;变量 1. handlers与notify Handlers&am…...

【C++进阶九】继承和虚继承

【C进阶九】继承和虚继承 1.什么是继承2.继承关系2.1protected和private的区别2.2通过父类的函数去访问父类的private成员2.3默认继承 3.基类和派生类对象的赋值转换4.继承中的作用域5.子类中的默认成员函数6.继承与静态成员7. 菱形继承8.虚继承9.继承和组合 1.什么是继承 继承…...

近日八股——计算机网络

一.c. TCP握手为什么三次、不能是二次、或四次? i.不能是两次: 防止已经失效的连接报文突然又传到了服务端&#xff0c;产生错误 如果不采用三次握手&#xff0c;服务端直接建立连接&#xff0c;会白白浪费资源 三次握手告诉服务端&#xff0c;客户端有没有收这个数据&#…...

HOW - Axios 拦截器特性

目录 Axios 介绍拦截器特性1. 统一添加 Token&#xff08;请求拦截器&#xff09;2. 处理 401 未授权&#xff08;响应拦截器&#xff09;3. 统一处理错误信息&#xff08;响应拦截器&#xff09;4. 请求 Loading 状态管理5. 自动重试请求&#xff08;如 429 过载&#xff09;6…...

自适应信号处理任务(过滤,预测,重建,分类)

自适应滤波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000...

电子电气架构 --- 面向服务的体系架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…...

TypeScript 装饰器类型详解

TypeScript 装饰器类型详解 一、类装饰器 // 参数&#xff1a;类的构造函数 function ClassDecorator(constructor: Function) {Object.defineProperty(constructor.prototype, timestamp, {value: Date.now()}); }ClassDecorator class DataService {// 装饰后自动添加times…...

Nyquist内置函数-杂项函数

1 Nyquist内置函数-杂项函数 1.1 杂项函数 这些函数对于日常使用来说都是安全且推荐的。 1.1.1 to-mono(sound) [SAL] (to-mono sound) [LISP] 如果 sound 是多声道声音&#xff0c;返回其所有声道的总和&#xff1b;如果 sound 本身就是单声道声音&#xff0c;则直接返回&…...

基姆拉尔森计算公式

基姆拉尔森计算公式&#xff08;Zellers Congruence 的变体&#xff09;是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算&#xff0c;直接得到星期几的结果。 公式定义 对于日期 年-月-日&#xff0c;公式如下&#xff1a…...

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问&#xff1a;怎么本地部署 DeepSeek 搭建个人知识库。 老实说&#xff0c;如果你不是为了研究技术&#xff0c;或者确实需要保护涉密数据&#xff0c;我真不建议去折腾本地部署。 为什么呢&#xff1f; 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…...

Python数据可视化-第6章-坐标轴的定制

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制&#xff0c;包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…...

18认识Qt坐标系

平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…...

动态循环表单+动态判断表单类型+动态判断表单是否必填方法

页面效果&#xff1a; 接口请求到的数据格式&#xff1a; list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…...

keep-alive缓存

#keep-alive缓存动态路由的使用指南# 代码如下图 &#xff1a; <router-view v-slot"{ Component }"> <keep-alive :include"[Hot, Notifications, User, Setting, Test]"> <component :is"Component" …...

25.4.3学习总结【Java】

又是一道错题&#xff1a; 1. 班级活动https://www.lanqiao.cn/problems/17153/learning/?page1&first_category_id1&sortdifficulty&asc1&second_category_id3 问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学&#xff0c;老师…...

Python入门(3):语句

目录 1 基本语句 1.1 表达式语句 1.2 赋值语句 2 控制流语句 2.1 条件语句 2.2 循环语句 while循环&#xff1a; for循环&#xff1a; 2.3 流程控制语句 1. break语句&#xff1a;退出整个循环体 2. continue语句&#xff1a;只跳过本次循环&#xff0c;还会进…...

运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)

运维之 Centos7 防火墙 1.介绍 Linux CentOS 7 防火墙/端口设置&#xff1a; 基础概念&#xff1a; 防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护计算机系统免受未经授权的访问和恶意攻击。Linux CentOS 7操作系统自带了一个名为iptables的…...

开发一个小程序需要多久时间?小程序软件开发周期

开发一个小程序所需时间受多种因素影响&#xff0c;以下为你详细列举&#xff1a; 一、需求复杂度。若只是简单展示类小程序&#xff0c;如企业宣传、产品介绍&#xff0c;功能单一&#xff0c;大概 1 - 2 周可完成。若涉及复杂交互&#xff0c;像电商小程序&#xff0c;涵盖商…...

【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林

文章目录 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 一、 什么是算法1. 算法的定义1.1 算法的五个特征1.2 好算法的特质 2. 时间复杂度3. 空间复杂度 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 &#x1f4ac;欢…...

新增帧能耗指标|UWA Gears V1.0.9

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 本次版本更新主要新增帧能耗指标&#xff0c;帮助大家对每一帧的能耗进行精准监控&#xff0c;快速…...

蓝桥杯嵌入式16届———LCD模块

LCD有官方给我们提供的库&#xff0c;我们使用其非常简单&#xff0c;唯一要注意的就是LCD和LED的引脚冲突。 引脚状况 STM32CubeMX 端口配置 使能 比赛给的选手 资源数据包中有以下三个文件&#xff0c;&#xff08;除去led相关的&#xff09;&#xff0c;将他们复制到自己…...

Ubuntu服务器挂载之前的数据硬盘

这里假设在挂载硬盘之前&#xff0c;您的硬盘从之前的服务器上正确卸载下来。请注意&#xff0c;以下任何操作不当都有可能导致硬盘数据丢失或损坏&#xff0c;如果您的数据非常重要&#xff0c;请及时备份。 1. 确认硬盘分区信息 使用以下命令查看磁盘信息&#xff0c;找到要…...

CMake在Windows环境下Visual Studio Code的使用

1&#xff0c;安装下载 地址&#xff1a;Visual Studio Code - Code Editing. Redefined 双击安装 选择安装路径 可勾选微软的AI工具 2&#xff0c;环境介绍 2.1 &#xff0c;界面介绍 2.2中文包的安装 下载中文简体 汉化后的界面 2.3 配置C/C环境 VSCode安装好之后&#xf…...

注意力机制在大语言模型中的原理与实现总结

注意力机制在大语言模型中的原理与实现总结 1. 章节介绍 在大语言模型的学习中&#xff0c;理解注意力机制至关重要。本章节旨在深入剖析注意力机制的原理及其在大语言模型中的应用&#xff0c;为构建和优化大语言模型提供理论与实践基础。通过回顾神经网络基础及传统架构的局…...

大学生机器人比赛实战(二)软件篇

大学生机器人比赛深度开发指南&#xff1a;核心技术详解与实战代码解析 作为参加过多次机器人竞赛的选手&#xff0c;我将详细剖析比赛中的核心技术实现&#xff0c;包括软件架构设计、实时系统应用、各大赛事代码特点以及性能优化技巧。本指南将帮助你从代码层面深入理解如何…...

AI大模型从0到1记录学习 day13

第 13 章 Python高级语法 13.1 浅拷贝与深拷贝  直接赋值&#xff1a;对象的引用&#xff08;别名&#xff09;&#xff0c;不产生拷贝。  浅拷贝&#xff1a;拷贝父对象&#xff0c;不会拷贝对象的内部的子对象。拷贝后只有第一层是独立的。  深拷贝&#xff1a;完全拷贝…...

大模型学习三:DeepSeek R1蒸馏模型组ollama调用流程

一、说明 目前DeepSeek R1及其蒸馏模型均支持使用ollama进行调用&#xff0c;可以在模型主页查看调用情况 deepseek-r1https://ollama.com/library/deepseek-r1 显存需求 &#xff0c;我们显存是16G&#xff0c;可以玩好几个 二、以14B模型演示 1、安装ollama curl -fsSL htt…...

RAGFlow部署与使用介绍-深度文档理解和检索增强生成

ragflow部署与使用教程-智能文档处理与知识管理的创新引擎 1. ragflow简介 ​ RAGFlow作为新一代智能文档处理平台&#xff0c;深度融合检索增强生成&#xff08;RAG&#xff09;技术与自动化工作流引擎&#xff0c;为企业级知识管理提供全栈解决方案。通过结合多模态解析、语…...