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音乐播放器开发实例(可毕设含源码)

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

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

相关文章

UML的9中图例概述

1. 用例图 (Use Case Diagram) 用例图描述了系统与外部用户&#xff08;参与者&#xff09;之间的交互。它主要用于捕捉系统的功能需求。 - 主要元素&#xff1a;用例&#xff08;Use Case&#xff09;、参与者&#xff08;Actor&#xff09;、关联&#xff08;Association&…

Qt6之调色板QPaletee

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言Qt之调色板 QPalette什么是 QPalette&#xff1f;QPalette 的作用如何使用 QPaletteQPalette可设置的部分常规操作示例代码和运行效果图 总结 前言 在开发 Qt …

数据治理:数据提取过程中的合规性与安全性

数据治理&#xff1a;数据提取过程中的合规性与安全性 随着数字化时代的到来&#xff0c;数据已经成为企业运营和决策的核心驱动力。然而&#xff0c;在数据提取的过程中&#xff0c;确保数据的合规性和安全性成为了企业面临的重要挑战。数据治理作为一种系统的方法&#xff0…

【C语言】C语言入门宝典:核心概念全解析

. C语言专栏 | C专栏 &#x1f449; 个人主页 &#x1f448; 前言 此篇文章我们主要是宏观的了解一下什么是C语言&#xff0c;C语言里面有那些知识点&#xff0c;所有的知识点我们此篇只是以入门为主&#xff0c;点到为止&#xff0c;简单易懂&#xff0c;后期的文章会一 一详…

嵌入式交叉编译:frp

参考 LINUX FRP下载编译_linux编译frpc-CSDN博客 编译 make -f Makefile.cross-compiles 检查 $ make -f Makefile.cross-compiles Build darwin-amd64... Build darwin-amd64 done Build darwin-arm64... Build darwin-arm64 done Build freebsd-amd64... Build freebsd-…

谷神前端组件增强:原组件

wait // 等待 function wait (component, key, callback) {if (component?.inited) {callback()} else {selfPage[${key}_callback] selfPage[${key}_callback] ?? []selfPage[${key}_callback].push(callback)} }run // 执行 function run (component, key) {let arr […

ubuntu18.04 + openssl + engine + pkcs11+ softhsm2 双向认证测试

安装环境 openssl 1.1.1 pkcs11-tool &#xff08;由sudo apt-get install opensc 安装&#xff09; libpksc11 &#xff08;需源码安装apt install 只有libp11, 源码安装才有 libpksc11.so&#xff09; softhsm2 &#xff08;由sudo apt-get install softhsm2 libsofthsm2-de…

三种方案解决:ImportError: DLL load failed while importing _cext: 找不到指定的模块

一、 pip install msvc-runtime某篇帖子里的&#xff0c;用这个解决问题的人还挺多&#xff0c;但我试了没用 二、 安装最新版vc 三、 numpyMKL https://github.com/cgohlke/numpy-mkl-wheels/

Servlet实践操作

Servlet运行原理 Tomcat 的代码内置了 main 方法&#xff0c;当我们启动 Tomcat 的时候&#xff0c;就是从 Tomcat 的 main 方法开始执行的 被 WebServlet 注解修饰的类会在 Tomcat 启动的时候就被获取并集中管理 Tomcat 通过反射这样的语法机制来创建被 WebServlet 注解修饰…

PCB设计隐藏的陷进

1、BGA芯片的开窗和过油设计。 加工工艺中&#xff0c;范式过孔都需要盖油设计&#xff0c;实心焊盘需要开窗设计&#xff0c;坚决不能盖油。 2、通孔设计的互联连通性 比如H3芯片的wifi设计&#xff0c;实际上是没有联通的&#xff0c;虽然四层板的中间层有焊盘&#xff0c;但…

操作系统-进程调度

进程调度 文章目录 进程调度前言进程和作业区别CPU调度程序抢占调度调度程序上下文切换 调度准则调度算法 前言 对于单处理器系统&#xff0c;同一时间只能有一个进程可以运行&#xff0c;其他的进程都应该等待&#xff0c;知道CPU空闲可以调度为止。 多道程序的目标是&#…

lua的GC

关于lua的gc云风大佬在 Lua GC 的源码剖析 系列文章中讲得很清楚&#xff0c;这里做一下简单的记录。 分步gc lua使用的是一种三色标记清除算法&#xff08;tri-color incremental mark & sweep&#xff09;&#xff0c;大体步骤如下&#xff1a; 初始阶段&#xff0c;所…

【FreeRTOS】估算栈的大小

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 目录 估算栈的大小回顾简介计算说明估计函数用到的栈有多大合计 估算栈的大小 回顾 上一篇文章链接&#xff1a;http://t.csdnimg.cn/Cc8b4 传送门: 上一篇文章 上一篇文章创建的三个任务 /* 创建任务&#xff1a;声 *…

22.HandlerPipeline

ChannelHandler用来处理Channel上的各种事件,分为入站和出站两种。 所有的ChannelHandler被连成一串,就是Pipeline。 入站处理器通常是ChannelInboundHandlerAdapter的子类,主要用来读取客户端数据,写回结果。 出站处理器通常是ChannelOutboundHandlerAdapter的子类,主…

Uni-app x

uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 是一个庞大的工程&#xff0c;它包括uts语言、uvue渲染引擎、uni的组件和API、以及扩展机制。 uts是一门类ts的、跨平台的、新语言。uts在iOS端编译为swift、在Android端编译为kotli…

LabVIEW开发为何仿制(致敬)经典成熟软件

​仿制&#xff08;致敬&#xff09;成熟软件进行LabVIEW开发更方便&#xff0c;因其提供了稳定的架构和结构、优化的用户体验和界面设计、技术规范和标准、稳定性和可靠性。结合用户手册和现有操作进行仿制&#xff0c;就像小米致敬保时捷一样&#xff0c;可以提高开发效率、降…

vivado SITE

描述 SITE是一个设备对象&#xff0c;表示许多不同类型的逻辑资源之一 可在目标Xilinx FPGA上获得。 SITE包括SLICE/CLB&#xff0c;它们是基本逻辑元件&#xff08;BEL&#xff09;的集合&#xff0c;如 查找表&#xff08;LUT&#xff09;、触发器、多路复用器&#xff0c;携…

QT/基于TCP的服务端实现

代码 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),p(new QTcpServer(this))//给服务器指针申请空间 {ui->setupUi(this); }Widget::~Widget() {delete ui; }void W…

实测:三款垃圾CPU推理Llama3 8B

经常有一些朋友问我本地运行大模型的电脑需要什么样的配置。其实一些常用大模型的运行需要的硬件并不像我们想象的那样高不可攀。不要被那些复杂的技术术语所吓倒&#xff0c;关键在于亲自动手尝试。 “不试&#xff0c;怎么知道呢&#xff1f;” 这句话道出了真理。今天&#…

【Linux】基础IO_1

文章目录 六、基础IO1. C语言的文件接口2. 系统文件I/O 未完待续 六、基础IO 1. C语言的文件接口 我们知道 文件 文件内容 文件属性 。即使是一个空文件&#xff0c;仍然会在磁盘中占据空间。那打开文件是什么意思呢&#xff1f;其实文件打开的意思就是&#xff1a;将文件从…