Qt 进程间通信(一)——QSharedMemory共享内存

QSharedMemory共享内存

  • 序言
  • 环境
  • 理论—逻辑理解
  • 实战—代码
    • 读取示例
    • 写入示例

序言

讲讲Qt的共享内存吧,巩固下

环境

msvc2022
Qt5.15
参考文档:https://doc.qt.io/qt-5/qsharedmemory.html

理论—逻辑理解

看下面前,你需要将共享内存看成一个游离所有程序之间的有id内存资源

要想共享内存被其他程序发现,就需要设置key键值,当设置之后,别的程序才可以通过key准确找到这个共享内存。

QSharedMemory::QSharedMemory(const QString &key, QObject *parent = nullptr)
void QSharedMemory::setKey(const QString &key)

所有需要访问的程序持有的共享内存对象,都需要设置同样的key值

QSharedMemory::create
程序A启动
程序A结束
程序B启动
程序B结束
共享内存

上面是正常运行的两个程序

程序A用QSharedMemory::create创建了一个共享内存。

QSharedMemory::create创建之后,会自动QSharedMemory::attach连接上共享内存。

当程序A持有的QSharedMemory对象释放掉或者调用QSharedMemory::detach()都会使程序A与共享内存分离。

如果程序B想要读写共享内存,则调用QSharedMemory::attach连接上共享内存。

QSharedMemory::create
QSharedMemory对象释放
QSharedMemory::create
QSharedMemory::detach
程序A启动
程序A结束
程序B启动
程序B结束
共享内存
释放共享内存

有一个特别关键需要注意的地方:

程序A启动
程序A结束
程序B启动
程序B结束
共享内存

当所有程序都没有连接共享内存,共享内存将会释放掉,这时再想使用这个共享内存就必须重新QSharedMemory::create创建,就和共享指针一样。

还有一些如和别的非Qt程序进行共享内存通信的注意事项等问题,可以看参考文档。

实战—代码

在这里插入图片描述

读取示例

if (!sharedMemory.attach()) {ui.label->setText(tr("Unable to attach to shared memory segment.\n" \"Load an image first."));return;
}QBuffer buffer;
QDataStream in(&buffer);
QImage image;sharedMemory.lock();
buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
buffer.open(QBuffer::ReadOnly);
in >> image;
sharedMemory.unlock();sharedMemory.detach();
ui.label->setPixmap(QPixmap::fromImage(image));

写入示例

// load into shared memory
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << image;
int size = buffer.size();if (!sharedMemory.create(size)) {ui.label->setText(tr("Unable to create shared memory segment."));return;
}
sharedMemory.lock();
char *to = (char*)sharedMemory.data();
const char *from = buffer.data().data();
memcpy(to, from, qMin(sharedMemory.size(), size));
sharedMemory.unlock();

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

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

相关文章

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中&#xff0c;Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件&#xff0c;Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。 安装 Brasero 在大多数 Ubuntu 版本中&#xff0c…

JS数据类型检测的方式有哪些 (常用)

typeof 其中数组、对象、null都会被判断为object&#xff0c;其他判断都正确typeof返回的类型都是字符串形式 instanceof instanceof &#xff1a;用于检测一个实例是否属于某个类&#xff0c;通过验证当前类的原型 prototype 是否出现在实例的原型链 __proto__ 上。它不能检测…

如何在Excel中对一个或多个条件求和?

在Excel中&#xff0c;基于一个或多个条件的求和值是我们大多数人的常见任务&#xff0c;SUMIF函数可以帮助我们根据一个条件快速求和&#xff0c;而SUMIFS函数可以帮助我们对多个条件求和。 本文&#xff0c;我将描述如何在Excel中对一个或多个条件求和&#xff1f; 在Excel中…

论文阅读:Large Language Models for Education: A Survey

论文由Hanyi Xu、Wensheng Gan、Zhenlian Qi、Jiayang Wu和Philip S. Yu撰写的 Large Language Models for Education: A Survey&#xff0c;是关于大型语言模型&#xff08;LLMs&#xff09;在教育领域应用的综合调查研究。 1. 引言 论文讨论了人工智能&#xff08;AI&#…

Python开发—— 异常处理:详细指南

以下是对Python中try语句及其相关用法的更详细解释&#xff0c;包括更多的示例和应用场景&#xff1a; 1. 异常处理的基本概念 异常是程序在运行过程中遇到的错误条件。处理异常可以防止程序在遇到错误时崩溃。Python 提供了 try、except、else 和 finally 语句来处理异常。 …

DataExcelServer局域网文件共享服务器增加两个函数

1、PFSUM合并指定路径下单元格ID的值 PFSUM("/103采购/8月采购名细","amount") 第一个参数为路径&#xff0c;第二个参数为单元格的ID 2、PFQuery 查询路径下 单元格ID值的列表 PFQuery("/103采购/8月采购名细","amount") 查询/103采…

【vue】JSON数据导出excel

前言 导出方式有很多种&#xff0c;但是若只需要数据导出成.xlsx文件并下载的话&#xff0c;只用xlsx一个插件就行 目标 1 实现数据导出excel 2 如何设置表格列宽 3 如何在文件中创建工作表 准备工作 1 安装 npm i xlsx -S 2 引入 npm i xlsx -S 二、导出excel 创建文件 con…

Windows总结

windows安装 Windows分类 旗舰版 不完整专业版 不完整服务器版 完整安装步骤 拔网线安装Windows系统 备份下载安装镜像制作启动U盘 推荐用大白菜加入BIOS系统设置为U盘启动优先重装Windows系统 U盘安装光盘安装 优点&#xff1a;一对一安装简单缺点&#xff1a;大量安装非常浪费…

LeetCode 算法:腐烂的橘子 c++

原题链接&#x1f517;&#xff1a;腐烂的橘子 难度&#xff1a;中等⭐️⭐️ 题目 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#…

选择适合的220V转5V电源芯片,220V转5V非隔离降压电源ic

#### 问题&#xff1a; 在设计一个需要将220V交流电转换为5V直流电的电路时&#xff0c;我应该选择哪种型号的电源芯片&#xff1f;我需要输出电流在200mA以内&#xff0c;有没有推荐的型号&#xff1f; #### 答案&#xff1a; 在220V交流电转换为5V直流电的应用中&#xff0c…

解析 pdfminer layout.py LAParams类及其应用实例

解析 pdfminer layout.py LAParams类及其应用实例 引言类的定义1. line_overlap2. char_margin3. word_margin4. line_margin5. boxes_flow6. detect_vertical7. all_texts 类的初始化参数验证类的表示总结 引言 在这篇文章中&#xff0c;我们将解析一个叫做 LAParams 的类。这…

Lumen 9/10 版本中使用 Laravel Lang

安装 composer require --dev laravel-lang/common:^4.1注册/加载 方式一&#xff08;推荐&#xff09; bootstrap/app.php 中取消注释 $app->register(App\Providers\AppServiceProvider::class); app/Providers/AppServiceProvider.php 的 register 方法中添加&#x…

[C++][ProtoBuf][Proto3语法][一]详细讲解

目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则 消息的字段可以⽤下⾯⼏种规则来修饰&#xff1a; singular&#xff1a;消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中&#xff0c;字段默认使⽤该规则 repeat…

从入门到精通:网络基础详解

前言 在现代社会&#xff0c;网络技术已经成为我们日常生活和工作中不可或缺的一部分。从简单的网页浏览到复杂的分布式系统&#xff0c;网络技术都扮演着至关重要的角色。通过这篇文章&#xff0c;读者将从入门到精通&#xff0c;全面掌握网络编程的理论和实践。 重点摘要 …

【Spring Boot】Spring AOP中的环绕通知

目录 一、什么是AOP?二、AOP 的环绕通知2.1 切点以及切点表达式2.2 连接点2.3 通知&#xff08;Advice&#xff09;2.4 切面(Aspect)2.5 不同通知类型的区别2.5.1 正常情况下2.5.2异常情况下 2.6 统一管理切点PointCut 一、什么是AOP? Aspect Oriented Programming&#xff…

if语句如果侧边栏没有值就填满,否则为width: 180px

要实现这个逻辑&#xff0c;我们可以使用JavaScript&#xff08;配合CSS&#xff09;来根据侧边栏&#xff08;我们假设是一个具有特定ID或类的DOM元素&#xff09;的内容或值来决定其宽度。 HTML 假设你的侧边栏有一个ID为sidebar&#xff1a; <div id"sidebar&quo…

STM32学习历程(day5)

EXTI外部中断 中断 中断就是在主程序运行过程中 出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;CPU会暂停当前的程序&#xff0c;去处理中断程序 处理完会返回被暂停的位置 继续运行原来的程序。 中断优先级 当有多个中断源同时申请中断时 CPU会根据…

【面试八股总结】线程基本概念,线程、进程和协程区别,线程实现

一、什么是线程&#xff1f; 线程是“轻量级进程”&#xff0c;是进程中的⼀个实体&#xff0c;是程序执⾏的最小单元&#xff0c;也是被系统独立调度和分配的基本单位。 线程是进程当中的⼀条执行流程&#xff0c;同⼀个进程内多个线程之间可以共享代码段、数据段、打开的文件…

王老师 linux c++ 通信架构 笔记(二)配置服务器为固定的 ip 地址、远程登录、安装 gcc g++ 与虚拟机文件夹共享

&#xff08;7&#xff09;本条目开始配置 linux 的固定 ip 地址&#xff0c;以作为服务器使用&#xff1a; 首先解释 linux 的网口编号&#xff1a; linux 命令 cd &#xff1a; change directory 改变目录。 ls &#xff1a; list 列出某目录下的文件 根目录文件名 / etc &a…

JAVA基础-----final关键字

一、前言 final关键字的含义&#xff1a; final在Java中是一个保留的关键字&#xff0c;可以声明成员变量、方法、类以及本地变量。一旦你用final修饰&#xff0c;你将不能改变被修饰的代码&#xff0c;编译器会检查代码&#xff0c;如果你试图将变量再次初始化的话&#xff0…