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

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();
}

四、注意事项

  1. 同步:因为多个进程可以同时访问共享内存,所以需要对共享内存进行同步控制。在上面的示例中使用了 lock()unlock() 方法来实现简单的同步。
  2. 大小限制:共享内存的大小是有限制的,具体大小取决于操作系统。创建共享内存时需要合理估计大小。
  3. 错误处理:在使用 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音乐播放器开发实例(可毕设含源码)

相关文章:

  • spark 整合 yarn
  • Elementui的el-dropdown组件使用与案例
  • ansible 模块进阶及变量
  • JS学习总结
  • 安卓开发拉起其他应用的常用方式
  • 项目经理究竟一年能挣多少钱?一起来看看
  • 人力资源招聘社会校企类型招聘系统校园招聘小程序
  • 基于PLC的全自动洗衣机控制系统课设
  • WDC西部数据闪存业务救赎之路,会成功吗?
  • 嵌入式实验---实验一 通用GPIO实验
  • 行列视(RCV)在生产数据监督中的优势
  • enum库
  • SSM实现设置商品秒杀券的后端设计思路
  • 互联网广告相关概念
  • Pyinstaller 打包exe后,打开出现can‘t find package tkdnd 报错
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2017 前端面试准备 - 收藏集 - 掘金
  • docker容器内的网络抓包
  • gcc介绍及安装
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript实现分页效果
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS实现简单的MVC模式开发小游戏
  • js中的正则表达式入门
  • KMP算法及优化
  • Koa2 之文件上传下载
  • SpingCloudBus整合RabbitMQ
  • Vue小说阅读器(仿追书神器)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 小程序测试方案初探
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #NOIP 2014# day.1 T2 联合权值
  • #stm32整理(一)flash读写
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (007)XHTML文档之标题——h1~h6
  • (7) cmake 编译C++程序(二)
  • (南京观海微电子)——示波器使用介绍
  • (排序详解之 堆排序)
  • (四)进入MySQL 【事务】
  • (转) Face-Resources
  • (转)Linux下编译安装log4cxx
  • (转)为C# Windows服务添加安装程序
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET命令行(CLI)常用命令
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • ::before和::after 常见的用法
  • @GetMapping和@RequestMapping的区别
  • @staticmethod和@classmethod的作用与区别
  • [ Linux ] Linux信号概述 信号的产生
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [BUG]vscode插件live server无法自动打开浏览器
  • [FreeRTOS 基础知识] 栈
  • [hdu 1711] Number Sequence [kmp]
  • [ios]准备好app后使用xcode发布ios操作