QSharedMemory使用详解
QSharedMemory
是 Qt 提供的一个类,用于在多个进程之间共享内存。它可以让您在不同的进程间传递数据,而无需通过文件或网络来进行传输。下面是 QSharedMemory
的详细用法和相关知识点。
一、基本概念
- 共享内存:共享内存是一块可以被多个进程同时访问的内存区域。通过共享内存,不同进程可以直接读写同一块数据,从而实现高效的数据传递。
- 关键字:每块共享内存都有一个唯一的关键字,用于标识这块内存。
二、常用方法
-
构造函数:
QSharedMemory(const QString &key, QObject *parent = nullptr);
创建一个
QSharedMemory
对象,并指定共享内存的关键字key
。 -
创建共享内存:
bool create(int size, QSharedMemory::AccessMode mode = QSharedMemory::ReadWrite);
创建指定大小的共享内存。
size
表示内存大小,mode
表示访问模式,默认是读写模式。 -
附加到现有共享内存:
bool attach(QSharedMemory::AccessMode mode = QSharedMemory::ReadWrite);
附加到现有的共享内存段。
mode
表示访问模式。 -
分离共享内存:
bool detach();
分离共享内存段,使得当前进程不再访问这块共享内存。
-
写入数据:
void *data();
获取共享内存的指针,通过这个指针可以直接操作共享内存。
-
检查是否已附加:
bool isAttached() const;
检查当前对象是否已附加到共享内存段。
-
获取错误信息:
QString errorString() const;
获取最近一次操作的错误信息。
三、示例代码
下面是一个简单的示例,演示如何使用 QSharedMemory
在两个进程之间共享数据。
3.1 进程 A:创建和写入共享内存
#include <QCoreApplication>
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSharedMemory sharedMemory("SharedMemoryExample");if (!sharedMemory.create(1024)) {qDebug() << "Unable to create shared memory:" << sharedMemory.errorString();return -1;}// 写入数据到共享内存QByteArray data;QBuffer buffer(&data);buffer.open(QBuffer::WriteOnly);QDataStream out(&buffer);out << QString("Hello from process A");buffer.close();sharedMemory.lock();char *to = (char*)sharedMemory.data();const char *from = data.data();memcpy(to, from, qMin(sharedMemory.size(), data.size()));sharedMemory.unlock();qDebug() << "Process A wrote data to shared memory.";return a.exec();
}
3.2 进程 B:读取共享内存
#include <QCoreApplication>
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSharedMemory sharedMemory("SharedMemoryExample");if (!sharedMemory.attach()) {qDebug() << "Unable to attach to shared memory:" << sharedMemory.errorString();return -1;}sharedMemory.lock();QBuffer buffer;QDataStream in(&buffer);QByteArray data((char*)sharedMemory.constData(), sharedMemory.size());buffer.setData(data);buffer.open(QBuffer::ReadOnly);QString message;in >> message;sharedMemory.unlock();qDebug() << "Process B read data from shared memory:" << message;return a.exec();
}
四、注意事项
- 同步:因为多个进程可以同时访问共享内存,所以需要对共享内存进行同步控制。在上面的示例中使用了
lock()
和unlock()
方法来实现简单的同步。 - 大小限制:共享内存的大小是有限制的,具体大小取决于操作系统。创建共享内存时需要合理估计大小。
- 错误处理:在使用
QSharedMemory
时,随时检查返回值并处理可能的错误,可以通过errorString()
获取详细的错误信息。
总结
QSharedMemory
是一个高效的进程间通信方式,通过共享内存,多个进程可以共享数据,提高通信效率。在使用时需要注意同步问题和错误处理。通过上述示例,您可以快速掌握 QSharedMemory
的基本用法,并在实际开发中灵活应用。
其他QT文章
1. QT开发环境安装以配置。
2. QT线段画板实战
3. 半小时玩转QT桌面系统托盘(含托盘消息)
4. QT入门开发一个时钟
5. 半小时教你做大转盘游戏(QT篇)
6. 手把手教你制作【带吸附效果的线段绘制】(QT)
7. 手把手教你开发-滚动效果号码抽奖(QT)
8. 100行代码实现贪吃蛇小游戏
9.C++实现《扫雷》游戏(入门经典)
10. svg转图片工具开发
11. Qt网路与通信(获取本机网络信息)
12. Qt网路与通信(UDP客户与服务)
13. Qt网络与通信(TCP聊天室)
14. Qt多线程以及线程池
15. Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例
16. 取色器(QT)
17. MQTT客户端入门开发
18.QT文件上传带进度条实例(含源码)
19. Qt音乐播放器开发实例(可毕设含源码)
相关文章:
QSharedMemory使用详解
QSharedMemory 是 Qt 提供的一个类,用于在多个进程之间共享内存。它可以让您在不同的进程间传递数据,而无需通过文件或网络来进行传输。下面是 QSharedMemory 的详细用法和相关知识点。 一、基本概念 共享内存:共享内存是一块可以被多个进程…...

Gartner发布2024年人工智能技术成熟度曲线:29项决定人工智能领域发展方向的前沿和趋势性技术
人工智能投资已达到新高,重点是生成式人工智能,但在大多数情况下,该技术尚未实现预期的商业价值。这项研究通过分析各种人工智能创新(其中许多创新正在快速发展),帮助人工智能领导者确定其他值得投资的技术…...

顺势而为:雷军、小米与创业成功的深层思考
一、引言 在当今快速发展的商业环境中,成功的企业家如马云和雷军,都以其独特的商业智慧和不懈的勤奋精神赢得了业界的尊重。然而,当我们深入探讨他们的成功之道时,会发现一个更为核心的因素——“顺势而为”。本文将基于雷军对不…...

Java+ffmpeg 合并两个mp4文件
使用ffmpeg测试命令 ffmpeg -i "E:\Monitor\video_20240617_10.mp4" -i "E:\Monitor\video1_20240617_10.mp4" -filter_complex "[0:v][0:a][1:v][1:a]concatn2:v1:a1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -c:a…...

汽车IVI中控开发入门及进阶(三十一):视频知识扫盲
有效的视频资源管理需要集成许多不同的底层技术,共同为用户提供给定应用程序的最佳体验。其中许多技术是从早期电视广播中使用的技术演变而来的。其他方法,如用于通过网络流式传输视频的压缩方法,相对较新且不断发展。 以下详细概述了与图形和视频处理和传输相关的一些基本…...

【后端】Java学习笔记(二周目-1)
环境 安装JDK8并配置环境变量 jvm核心类库jre jre开发工具jdk Java基础运行流程,代码从上到下,从左往右,只运行一次 桌面—>新建文件夹—>新建记事本—>打开编写代码 public class Hello{public static void main(String[] arg…...

PDF文档翻译软件哪个好?分享5款快速翻译的工具
世界各地的交流日益密切,文档翻译服务因此变得不可或缺。 无论是企业间的跨国商务合同,还是学术领域的专业研究论文,准确无误地将文档内容翻译成目标语言,对于保障信息的清晰传达和正确理解极为关键。 在这样的背景下࿰…...

哪些因素驱动新零售发展?新零售与传统零售、电子商务区别在哪?
零售业正经历着一场前所未有的变革,这场变革由多种因素驱动,涉及技术、消费习惯以及商业模式的全面升级。我们称之为”新零售”,它不仅仅是一个概念,更是零售业未来发展的方向。新零售的兴起,标志着零售行业正在迈向一…...

使用代理IP常见问题及解答
代理IP在互联网数据收集和业务开展中发挥着重要作用,它充当用户客户端和网站服务器之间的“屏障”,可以保护用户的真实IP地址,并允许用户通过不同的IP地址进行操作。然而,在使用代理IP的过程中,用户经常会遇到一些问题…...

重磅!鹅厂大牛带你30分钟玩转AI智能结对编程!
在大模型时代,人工智能技术的突破性进展正重塑着软件开发的面貌。AI的融入不仅优化了代码编写过程,更开启了智能编程的新纪元,为开发者带来了前所未有的工作效率和创新可能。AI结对编程不仅能够极大提升研发效率,还能通过智能分析…...

研究Redis源码的一些前期准备
一 背景 Redis数据结构讲完后,觉得还是有点不过瘾,想研究一下Redis的底层实现。找了一些相关资料,准备借鉴和学习其他各位大佬钻研Redis底层的方法和经验,掌握Redis实现的基本原理。 二 源码归类 网上有大佬已经总结了…...

用PHP来调用API给自己定制一个“每日新闻”
头条新闻汇聚了互联网上的时事动态,提供最新新闻动态、网络热门话题和视频更新等,覆盖社会、政治、体育、经济、娱乐、科技等多个领域,并不断刷新内容。企业应用这一接口后,可以快速吸引更多的用户访问自己的平台。即使是非新闻类…...

AGI时代,程序员想学习大语言模型(LLM),应该从哪里开始?
程序员25岁做什么能够改变35岁被淘汰的命运?对于程序员的新一轮革命,我觉得人工智能大模型方向是你可以认真审视的一个方向,你可以选择通过它创业,也可以选择进入这个领域,它是一个更加开放的领域,也让程序…...
Vue在表单校验中trigger属性指定何时触发校验规则
Vue在表单校验中trigger属性指定何时触发校验规则 一、前言1.示例代码 一、前言 在表单校验中,trigger 属性用于指定何时触发校验规则。常见的触发方式包括 "change" 和 "blur". 它们的区别如下: trigger: "change": 触发…...
【多线程实例】
使用场景 拿到了一个商品的list,然后要循环list去获取每个商品的明细,由于调用api很依赖于网络,一个个执行速度慢,所以考虑使用线程去解决。 //根据机器id 获取 所有商品信息 public List<ProductResponse> productList(MachineConf…...
数据治理在数据提取中的角色:确保数据质量和安全
在数字化浪潮中,数据已成为企业运营和决策的核心驱动力。然而,随着数据量的快速增长和来源的多样化,如何确保所提取数据的质量和安全性成为企业面临的重大挑战。数据治理,作为一种系统的管理方法,在数据提取过程中扮演…...

Nuxt快速学习开发 - Nuxt3静态资源Assets
Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具(Vite 或 webpack)处理的所有资产。 public/目录 public目录用作静态资产的公共服务器,可在您的应用程序定…...

为什么企业需要数据挖掘平台?哪个比较好呢?
什么是数据挖掘? 数据挖掘就是从大量的数据中去发现有用的信息,然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢?实际上,数据挖掘就是智能化的数据分析,它们的目标都是一样的。但是,…...

leetCode-hot100-链表专题
leetCode-hot100-链表专题 链表简介单链表单链表的使用例题206.反转链表19.删除链表的倒数第N个结点24.两两交换链表中的节点25.K个一组翻转链表 双向链表双向链表的使用 循环链表61.旋转链表141.环形链表142.环形链表Ⅱ LinkedListLinkedList的使用 链表简介 参考博客&#x…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...