QtSharedMemory——Qt程序之间的内存共享机制

Qt多进程间通信方式——共享内存 正文 Windows平台下进程间通信常用方式有管道、文件映射、Socket通信和共享内存等,这里详细介绍一下Qt的共享内存机制。 Qt官方例子 Qt官方的例子主要是一个客户端加载图片后,将图片存储到共享内存中,另一个客户端从共享内存中获取图片显示。 加载图片客户端效果: 获取图片客户端效果: 加载图片的相关代码: void Dialog::loadFromFile() { if (sharedMemory.isAttached()) detach(); ui.label 阅读详情

今天下午闲的发慌,论文看得脑袋涨,继续翻阅Qt Demos & Examples,看到一个比较有意思的程序。总的来讲是用到QsharedMemory来共享图片,在2个程序实例之间!


先是构造函数

Dialog::Dialog(QWidget *parent)
   :QDialog(parent), sharedMemory("QSharedMemoryExample")
{}

以字符串QSharedMemoryExample给sharedMemory构造函数,是将这个字符串作为一个key id,系统就知道程序将联系的是哪个sharedMemory了。

// 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 memorysegment."));
        return;
    }
    sharedMemory.lock();
    char *to = (char*)sharedMemory.data();
    const char *from = buffer.data().data();
     memcpy(to,from, qMin(sharedMemory.size(), size));
    sharedMemory.unlock();

关键代码就这么点,用QDataStream将QImage写入一个QBuffer。锁定sharedMemory,使用memcpy将buff中的数据拷贝一份到sharedMemory,然后解锁。

void Dialog::loadFromMemory()
 {
    if (!sharedMemory.attach()) {
        ui.label->setText(tr("Unable to attach to shared memorysegment.\n" \
                              "Load animage 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));
 }

从sharedMemory读出数据用了QBuffer的setData,貌似感觉方便很多啊。

 

Qt会在最后一个进程或线程detach()之后直接销毁QSharedMemorysegment,并且由于用了Qt特殊的机制,非Qt应用程序无法使用这个功能。

 

QBuffer内部其实是一个QByteArray,为之提供了一个QIODeviceinterface,因为QByteArray只是一个容器,而QBuffer提供了一个借口,用于写入读出其中的数据,比较原始的是用putChar(),write(),read(),readLine()等等。高级点就用QDataStream输入输出Qt类型数据。

 

Ps:ui.label->setPixmap(QPixmap::fromImage(image));这句比较给力。

qt共享内存的官方例程解析 摘要: 1. qt在使用共享内存时,包含qsharememory 2. qtcreator同一时间只能跑一个debug一个(这个工程需要使用两个,一个用来写入共享内存,一个用于读取),所以需要将这个工程发布再使用 3. 它使用qdatagram 进行二进制流入 4. 重点看:loadFromFile()【写入共享内存】,和loadFromMemory()【从共享内存中读取】 5. sharedMemory(“QSharedMemoryExample”)初始化的时候对共享内存指定了key即QSharedMem 阅读详情

相关推荐

QT使用共享内存

1、一个进程创建共享内存之后,其它进程可以访问共享内存,也就是多个进程都可以访问共享内存,可以实现进程间通信。 2、如果想多个进程都可访问共享内存,就必须访问共享内存的进程都设置相同的密匙setkey()。 3、一个进程创建( create()函数 )共享内存之后,当前进程自动和共享内存attach了,不用调用attach()函数;其它进程要想访问共享内存,要先调用attach()函数。 4、...

小米的修行之路 4347

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

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

weixin_43246170的博客 4319

QT共享内存QSharedMemory读写例子

QT共享内存QSharedMemory读写例子

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

【代码】Qt多进程-共享内存(Shared Memory)

github_37290846的博客 1992

小曾WRF自学日记(3)渐入佳境 ——WRF实例-数据下载与WPS前处理

ww

weixin_46297571的博客 1480

谷歌浏览器崩溃排查:闪退、卡死、网页打不开的修复指南

浏览器多进程架构通过进程隔离、GPU加速和扩展沙箱提升网页渲染效率,但配置损坏、扩展冲突、显卡驱动异常或系统资源不足时,常会以闪退、卡死、白屏、内存占用飙升和能上微信却打不开网页等形式暴露。排查价值在于先分层定位系统、进程、配置扩展与网页内容,再用无痕模式、chrome://crashes、chrome://gpu和浏览器任务管理器收集证据,避免盲目重装。对办公、开发运维和日常维护场景,禁用扩展、关闭硬件加速、刷新DNS缓存、重置配置文件乃至干净重装,都是可复用的工程化处置手段。围绕谷歌浏览器崩溃的典型症状

weixin_34138056的博客 426

QT程序利用共享内存实现单例启动

1 实现原理 程序在启动第一个实例时,会先尝试attach一块指定key的共享内存,由于这个共享内存事先并不存在,所以尝试attach失败。失败之后,第一个实例会create这块指定key的共享内存。 当程序启动第二个实例时,依然会先尝试attach一块指定key的共享内存,由于这个共享内存刚被第一个实例创建,所以尝试attach返回true。于是得知,当前实例并非第一个实例,便不允许第二个实例继续启动。 流程图如下: Ps: ...

thequitesunshine007的博客 856

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

什么时候勾选Bake into pose,当不希望动画带动游戏对象旋转时。在旋转的动画中一般是不用勾选的,因为就需要用它来带动我们的角色对象旋转。但在比如前进、后退、待机等动画来说,我们就可以勾选这里,以避免因动画文件本身的瑕疵而给我们带来的旋转。loop match:代表了这个动画在角度上的吻合度。如果这个动画在播放中转角过大,那么就会显示红色,告诉我们如果勾选bake into pose,则会带来不好的效果。

weixin_60154963的博客 6805

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

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

weixin_34393428的博客 1828

基于MATLAB的Hough变换指针式仪表识别

综上所述,本文介绍了如何使用MATLAB中的Hough变换算法来实现指针式仪表的自动识别和读数。通过图像预处理、Hough变换和直线提取,我们可以准确地检测指针的位置,并进一步进行仪表读数。本文将介绍如何使用MATLAB中的Hough变换算法来实现指针式仪表的自动识别和读数。在指针式仪表识别中,我们可以利用Hough变换来检测仪表盘上的指针。以上是基于MATLAB的Hough变换指针式仪表识别的详细步骤和源代码示例。根据指针在仪表盘上的位置,我们可以进行角度计算或使用其他技术来获取准确的读数。

techDM的博客 463

WCK Operation (WCK 操作)

LPDDR6 SDRAM采用双时钟系统(WCK和CK),其中WCK频率是CK的两倍。为确保数据正确传输,需通过WCK2CK同步操作使两种时钟对齐。LPDDR6支持两种同步模式:Auto-sync off模式和WCK Always on模式,可通过MR22寄存器选择。同步操作由特定命令(Read/Write/MRR等)触发,需在满足特定时序参数(如tWCKENL、tWCKPRE等)后完成。同步前必须完成WCK2CK训练,且不同操作(读取/写入/CAS)有各自的时序要求。该机制确保数据在正确时钟相位下传输,是L

李家小院 650

Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式...

共享内存 就之前不是开发了一个Leventure_DeveloperKey用以调试程序嘛,在这里简单聊一下调试模式的方案。 这里的调试分为了两种,一种是调试模式,一种是开发者模式。需要这两种模式的原因也很简单:1.在远程调试的时候,我可能需要程序从头开始进入调试,这就要求程序一直卡在开头的某个位置。2.在程序使用的时候可能需要一些特殊的按钮,这个按钮就可以让它有一个后门,让它能够以一些特别的状态...

Andius的博客 186

Python爬虫实战:社交媒体热点事件追踪与情感分析可视化

本文探讨了如何利用Python爬虫技术从微博和Twitter等社交媒体平台抓取数据,进行热点事件追踪和情感分析,并通过可视化方式展示舆论情感变化。文章详细介绍了最新的爬虫技术、数据处理方法和可视化实现,提供了完整的代码示例,帮助读者构建自己的社交媒体分析系统。关键词:Python爬虫、社交媒体分析、情感分析、数据可视化、热点追踪爬虫框架:Requests-HTML、aiohttp、Twint(Twitter专用)数据处理文本处理:Jieba(中文分词)、NLTK(英文处理)情感分析。

2201_76125261的博客 1105

"unable to attach to shared memory segment"问题的解决

将$ORACLE_HOME/bin/oracle的权限改为6751[@more@] ...

cuanyangpa3685的博客 1657

图像质量评估和点云质量评估

本文介绍了图像质量评估和点云质量评估的基本概念和常用方法,并提供了相应的源代码示例。图像质量评估关注图像的视觉质量,常用的评估指标包括均方误差(MSE)、结构相似性指标(SSIM)和峰值信噪比(PSNR)。点云质量评估关注点云数据的准确性和完整性,常用的评估方法包括点云配准质量评估、稠密重建质量评估和离群点检测质量评估。在计算机视觉和计算机图形学领域中,图像质量评估和点云质量评估是两个重要的任务。图像质量评估旨在量化图像的视觉质量,而点云质量评估则关注于点云数据的准确性和完整性。

XsupDatabase的博客 990

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5384

Qt学习—qt共享内存的使用

Qt提供了QSharedMemory类来访问共享内存,实现共享内存的操作。 一、QSharedMemory类常用的操作 1、QSharedMemory类对象的创建 利用QSharedMemory类创建实例对象时,必须为该共享内存指定关键字(即为该共享内存起一个名字)。只有当共享内存被设置了关键字之后,才可以执行创建create()、关联attach()等操作。为共享内存指定关键字有两种方

GDUTLYP的专栏 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

QT之共享内存

qt为进程间通讯提供了QSharedMemory类来访问共享内存,实现进程间通讯。 使用QSharedMemory访问共享内存的发送端一般写法是首先在构造QSharedMemory时写入key,只有写入key以后才能创建、关联等对共享内存的操作。而读取端也是依靠key相连接。 需要注意的是,传递信息一般使用QByteArray类型传递,接收以后再通过fromLocal8Bit转为Q...

dzhongjie的博客 2344

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Qt共享内存实现进程间消息队列

在Qt 5.9中,可以使用Qt的跨进程通信机制来实现进程间的消息队列。请注意,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。另外,Qt还提供了其他跨进程通信的机制,如QtDBus和QtRemoteObjects,你也可以根据实际情况选择使用。这样,服务器端就可以接收到客户端发送的消息,并进行处理。注意,服务器端和客户端都需要连接到相同的共享内存和信号量。首先,你需要创建一个消息队列的服务器端和客户端。服务器端负责接收和处理消息,客户端负责发送消息。// 连接到共享内存和信号量。

kupePoem的专栏 3046

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Qt程序访问windows C++创建的共享内存失败解决办法

L"MySharedMemory" // 共享内存名称(需唯一)INVALID_HANDLE_VALUE, // 使用物理内存而非文件。NULL, // 默认安全属性。0, // 内存大小高位。sizeof(SharedData), // 内存大小低位。PAGE_READWRITE, // 可读可写。Qt程序访问windows C++创建的共享内存失败,需要使用。

qq_42813483的博客 361

Qt之共享内存实现进程间通信(QSharedMemory)学习笔记

Qt之共享内存实现进程间通信(QSharedMemory)学习笔记 共享内存实现步骤: 一、往共享内存中加入数据 1、定义QSharedMemory sharedmemory,并设置标志名sharedmemory.setkey(); 2、将共享内存与主进程分离sharedmemory.detach(); 3、创建共享内存sharedmemory.create(); 4、将共享内存上锁sharedm...

weixin_40402862的博客 736

Qt进程间通信之共享内存的实现

Qt进程间通信的共享内存实现和使用示例

Mei20140912的专栏 1037

Qt内存共享(跨线程进程交互)

跨进程数据交互;内存共享;

C++初学者 1636

QT ShareMemory共享内存

步骤上,我必须先执行ShareMemory_write,将图片导入界面了才能再运行ShareMemory_read,如果两个程序先后启动,我再点导入按钮,导入图片后,点导出没有反应。导出图片后,关闭程序ShareMemory_write,执行ShareMemory_read,打印“关联共享内存失败”。共享内存是一个特定的内存区域,可以被多个进程同时访问。//注意一定要保留图片的原格式,不然我之前选的bmp格式,导出后图片背景为黑色,不是原图。当一个进程写入共享内存后,关闭这个程序,共享内存的数据不在了吗?

m0_53891310的博客 1795

Qt 共享内存QSharedMemory使用方法

【代码】Qt 共享内存QSharedMemory使用方法。

yuchunhai321的博客 984

ORA-27123: unable to attach to shared memory segment

今日启动RAC数据库,遇到报错 1、环境说明 Oracle 11.2.0.4 两节点RAC Redhat 6.3 2、错误如下 SQL> startup ORA-01078: failure in proce...

cuizhi4718的博客 1828
上一篇: virtualBox guest与host共享文件
下一篇: Qt Graphics View 框架
doctorsc
博客等级 码龄19年 51粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值