Qt多进程-共享内存(Shared Memory)

Qt 进程间共享内存通信及同步问题。 文章目录序言进程间通讯方式使用原因共享内存通讯的几个问题解决问题Qt 同步信号量代码示例单向主从通讯服务端进程发送server.hserver.cpp客户端进程接收client.hclient.cpp运行结果双向全工通讯服务端server.hserver.cpp客户端client.hclient.cpp 序言 本文只对共享内存通讯做扩展启发,所示代码,并不能用于实际开发,需要自己稍作修改。 进程间... 阅读详情

在Qt中使用共享内存(Shared Memory)进行多进程程序开发,主要涉及以下步骤、代码示例和相关注意事项:

步骤:

  1. 创建共享内存区域:
    • 使用QSharedMemory类来创建一个共享内存对象。
    • 设定一个唯一的共享内存键名,用于进程间标识和访问同一块共享内存。
  1. 挂载共享内存:
    • 尝试将共享内存对象挂载(attach)到进程的地址空间。
    • 如果共享内存已经存在,需要判断其大小是否满足需求。
  1. 访问共享内存:
    • 通过指针或引用直接操作共享内存中的数据。
    • 可以使用互斥锁(如QMutex)来同步不同进程对共享内存的访问,以避免数据竞争。
  1. 分离共享内存:
    • 在不再需要访问共享内存时,应该将其从进程地址空间分离(detach)。
  1. 删除共享内存:
    • 当所有进程都不再需要共享内存时,应该将其删除以释放系统资源。

代码示例:

以下是一个简化的Qt共享内存使用示例:

#include <QSharedMemory>  
#include <QDebug>  
#include <QByteArray>  
#include <QMutex>  
#include <QMutexLocker>  
  
int main(int argc, char *argv[]) {  
    QCoreApplication a(argc, argv);  
  
    // 创建共享内存对象,并指定一个唯一的键名  
    QSharedMemory sharedMemory("mySharedMemoryKey");  
  
    // 设置共享内存的大小  
    if (!sharedMemory.create(1024) && sharedMemory.error() == QSharedMemory::AlreadyExists) {  
        // 共享内存已存在,尝试挂载它  
        if (!sharedMemory.attach()) {  
            qDebug() << "Unable to attach to existing shared memory segment.";  
            return -1;  
        }  
    }  
  
    // 锁定共享内存以安全访问  
    QMutex *mutex = new QMutex(QMutex::Recursive);  
    const char *to = static_cast<const char *>(sharedMemory.constData());  
  
    // 使用互斥锁保护共享内存的读写  
    QMutexLocker locker(mutex);  
    QByteArray data(to, sharedMemory.size());  
    qDebug() << "Read from shared memory:" << data;  
  
    // 写入数据到共享内存  
    QByteArray newData("Hello from another process!");  
    if (sharedMemory.size() < newData.size()) {  
        if (!sharedMemory.detach()) {  
            qDebug() << "Unable to detach from shared memory.";  
            return -1;  
        }  
        if (!sharedMemory.create(newData.size())) { // 重新设置大小  
            qDebug() << "Unable to resize shared memory segment.";  
            return -1;  
        }  
    }  
    void *toMem = sharedMemory.data(); // 获取指向共享内存的指针  
    memcpy(toMem, newData.constData(), newData.size()); // 复制数据到共享内存  
  
    // 分离并删除共享内存(如果这是最后一个使用该共享内存的进程)  
    if (!sharedMemory.detach()) {  
        qDebug() << "Unable to detach from shared memory.";  
        return -1;  
    }  
    // 注意:通常不在此处删除共享内存,除非你确定没有其他进程正在使用它。  
  
    return a.exec();  
}

注意事项:

  • 键名唯一性:确保为共享内存指定一个唯一的键名,以避免与其他应用程序的共享内存冲突。
  • 错误处理:始终检查QSharedMemory对象的错误状态,并适当处理任何错误。
  • 同步机制:当多个进程同时读写共享内存时,使用同步机制(如互斥锁)来避免数据竞争。
  • 内存大小:在创建共享内存时,要确保其大小足够存储所需数据。如果需要更改大小,可能需要先分离再重新创建。
  • 资源清理:不再需要共享内存时,应将其分离并酌情删除,以释放系统资源。但要注意确保没有其他进程仍在使用该共享内存。
  • 跨平台兼容性:Qt的QSharedMemory类提供了跨平台的共享内存访问能力,但不同的操作系统可能对共享内存的支持和实现有所不同。在编写跨平台应用时,要确保考虑到这些差异。
Windows C++/Qt进程间通信:共享内存与消息机制实战详解 进程间通信(IPC)是操作系统与分布式系统的基础概念,用于实现不同进程间的数据交换与协同工作。其核心原理在于突破进程地址空间的隔离,通过操作系统提供的共享资源或通信机制传递信息。在技术价值上,高效的IPC能显著提升应用性能与模块化程度,是实现多进程协作、微服务架构及高性能计算的关键。在Windows桌面应用开发中,共享内存配合Windows消息机制是一种经典的高性能IPC方案,尤其适用于C++/Qt项目中的本地进程间实时数据同步与事件通知场景。该方案利用共享内存实现高速数据交换,并通过Windows消息机制 阅读详情

相关推荐

Qt共享内存(QSharedMemory)使用指南

文章详细解析了Qt框架中QSharedMemory共享内存机制的核心原理与实现方法。从性能角度对比了不同进程通信方式,指出共享内存适用于微秒级延迟场景。重点展示了代码实现模板,包括基础读写操作、复杂对象序列化和跨平台注意事项。同时提出性能优化建议,如内存预分配和零拷贝技术,并探讨了工业数据采集、嵌入式系统等典型应用场景。最后强调需平衡性能与安全性,合理运用该技术实现高效进程通信。

半青年的博客 1346

Qt程序只运行一个实例

QT应用程序单例

河马的BLOG 1638

MFC实现共享内存进行进程间通信(附完整源码)

MFC实现共享内存进行进程间通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 883

qt共享内存

一、说明 查看此文,共享内存,相信大家都知道进程间通信,即IPC(Inter-Process Communication),进程间通信是指两个进程的数据之间产生交互。而共享内存是实现进程通信的方式之一,其他通信方式可看下图: 查看各通信方式优缺点可访问链接,上图内容来源:进程间通讯的7种方式 应用场景分析 首先讨论一下为什么需要进程间通信?因为产品经理说项目需要。。。。。。,技术角度来说,不同的进程有自己的内存空间,正常情况下A进程是不能访问B进程的内存空间的。可是一些大型项目,因为项目业务比较复杂,于是

weixin_42887343的博客 7031

QT共享内存QSharedMemory读写例子

QT共享内存QSharedMemory读写例子

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

Qt进程通信之共享内存(QSharedMemory)

比如单机上只有一个实例,该实例需要在启动的时候加载一大块资源到内存,那么,如果基于共享内存,将资源加载到共享内存,那么,下次启动的时候,只要version或者crc没变,就可以直接挂载使用,无需再次读入。比如程序启动需要加载cpu型号、内存信息、系统属性、配置文件数据等等时,软件第一次启动时先将数据加载到共享内存,后面启动时只需要从共享内存读取数据,提升程序的启动速度。两个进程同时挂载一片共享内存,进程A写、进程B读,就达到了通信效果,这种方案的好处是,读写都是基于内存操作,效率非常之高。

weixin_43246170的博客 4319

动态数据脱敏技术分析

在当前国内信息安全热潮中,数据脱敏作为数据安全的重要一环得到了业界的认可与重视。早在2012年,数据脱敏首次作为一个单独的魔力象限由Gartner发布,Gartner在2014年又提出了:按照数据使用场景,将数据脱敏分为静态数据脱敏(Static data masking-SDM )与动态数据脱敏(Dynamic data masking-DDM )。 可能有人望文生义,认为动态数据脱敏一定比静态数据脱敏高级。非也非也,静态or动态,取决于脱敏的使用场景,主要是以使用场景为由来选择合适的数据脱敏的模式。 本

美创科技的博客 4674

QT 进程间通信-共享内存

简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信。但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种跨平台的进行间通信的方式-Shared Memory(共享内存)。 Qt提供的基于共享内存的IPC有QSharedMemory类和QSystemSemaphore类,QSharedMemory可...

technologyleader的专栏 522

【TM1650】STM8S TM1650芯片控制程序

以下为.h文件: #ifndef __TM1650_I2C_H #define __TM1650_I2C_H #include "stm8s.h" #include "stm8s_gpio.h" #include "tim1.h" #include "usart2.h" #include &lt;iostm8s103f3.h&gt; #include &lt;intrinsics....

cxw312864660的博客 1万+

S4HANA Rebate Management(条件合同) -Single Step

S4HANA 条件合同管理(Condition Contract Management), 包括如何创建条件合同,场景应用

m0_50200150的博客 2308

Qt之共享内存类QSharedMemory的使用及实现原理(全)(一)

跨平台支持:对不同操作系统(如 Windows、Linux 等)的底层共享内存机制进行封装,屏蔽了各系统间的差异,为开发者提供统一的接口,方便在不同平台上实现进程间共享内存通信。简化操作:提供了创建、附加、分离、删除共享内存等操作的简单方法,降低了使用共享内存的复杂度,开发者无需深入了解底层系统调用细节。数据共享:允许不同进程或线程访问同一块物理内存区域,实现高效的数据共享,避免了数据在不同进程间的多次拷贝,提高了数据传输效率。从使用的角度来讲,尤其是在线程或进程间数据通信来讲还是非常方便的;

红军不怕远征难,万水千山只等闲 2707

银行监管报送系统系列介绍(二十一):银行监管报送系统总览

为保护法院案件当事人、利害关系人的合法权益,全面落实《最高人民法院、中国银行业监督管理委员会关于人民法院与银行业金融机构开展网络执行查控和联合信用惩戒工作的意见》(法【2014】266号),最高人民法院和银监会联合下发了《人民法院、银行业金融机构网络执行查控工作规范》(法【2015】321号),要求银行金融机构配合最高人民法院开展 “总对总”网络执行查控工作,并建立相应的业务系统,实现与法院的网络对接,协助法院完成对被执行人银行账户存款及其他金融资金的网络查询、冻结与扣划工作。

银行信息系统应用架构详解 2868

Qt学习之路-进程间通信共享内存

Qt 提供了四种进程间通信的方式: 使用共享内存(shared memory)交互:这是 Qt 提供的一种各个平台均有支持的进程间交互的方式。 TCP/IP:其基本思想就是将同一机器上面的两个进程一个当做服务器,一个当做客户端,二者通过网络协议进行交互。除了两个进程是在同一台机器上,这种交互方式与普通的 C/S 程序没有本质区别。Qt 提供了 QNetworkAccessManager 对此进行...

波风水门 1472

42、使用mmrotate中k3det进行旋转目标检测,并进行mnn部署和ncnn部署

基本思想:仍然是身份证分割,并进行ncnn和mnn的c++的部署开发

sxj731533730 5711

R语言LASSO回归作图为什么X轴使用-log(λ)而不是log(λ),如何转化为log(λ)?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1017

Qt::共享内存

Qt使用QSharedMemory类操作共享内存段。把QSharedMemory看做一种指针,这种指针指向分配出来的一个共享内存段,这个共享内存段是由底层操作系统提供,可以供多个线程或进程使用。QSharedMemory不“拥有”共享内存段,当某一线程销毁QSharedMemory实例,或者所有线程都退出,WinDOWS内核会自动释放共享内存段。

weixin_41122707的博客 1121

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Qt之进程间通信(共享内存)

版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣、好玩、靠谱。。。作者:一去丶二三里 博客地址:http://blog.youkuaiyun.com/liang19890820 目录(?)[+] 简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信。但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息

billxin2012的专栏 1343

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Qt】Qt之进程间通信(共享内存)【转】

简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信。但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种跨平台的进行间通信的方式-Shared Memory(共享内存)。   简述 注意事项 加载进内存 说明 实现 从内存中读取 说明 实现

技术分享,共同成长 700

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

进程通信学习--Qt共享内存使用

Qt提供了共享内存的封装<QSharedMemory>,使用步奏相比windows的方式要简单的多。 按照写入和读取部分: 写入部分: QSharedMemory _sharedMemory;//声明 _sharedMemory.setKey("SharedMemoryTest");//设置访问密钥 bool isAttached = _sharedMemory.isAt...

qq_22545985的博客 500

Qt之进程间通信(共享内存) 转自 一去二三里

Qt之进程间共享内存 摘要: 简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信。但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种跨平台的进行间通信的方式-Shared Memory(共享内存)。 简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通

化天际的相遇---博客 1726

使用 Shared Memory 协议创建有效的连接字符串

从运行在同一台计算机上的客户端到 Microsoft SQL Server 的连接使用 shared memory 协议。共享内存没有可配置的属性。始终会先尝试使用共享内存,无法将其从“客户端协议属性”列表中“启用的协议”列表的顶部位置移开。可以禁用 shared memory 协议,在排除其他某个协议的故障时,这样做很有用。 不能使用 shared memory 协议来创建别名,但是如果启用了

tianlianchao1982的专栏 1162

Qt 进程间通信(二) QSharedMemory、QSystemSemaphore

是 Qt 中实现高性能本机进程间通信的重要方案。1. QSharedMemory 负责共享数据2. QSystemSemaphore 负责跨进程同步3. QReadWriteLock 不能直接跨进程用4. 多读单写需要自己基于 QSystemSemaphore 封装5. 固定结构体 + 环形缓冲区适合工业实时数据6. QLocalSocket 适合配合共享内存发送通知7. 共享内存不是数据库,不适合长期存储8. 真正零拷贝要求直接在共享内存结构上读写存放实时大数据提供跨进程多读单写保护。

xjw的博客 403
上一篇: 进程间通信IPC机制
下一篇: wxwidget和qt开发的区别和共同点
低配天才
博客等级 码龄10年 277粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值