Qt 进程间通信(一)——QSharedMemory共享内存

QSharedMemory共享内存

序言

讲讲Qt的共享内存吧,巩固下

环境

msvc2022

Qt5.15
参考文档https://doc.qt.io/qt-5/qsharedmemory.html

理论---逻辑理解

看下面前,你需要将共享内存看成一个游离所有程序之间的有id内存资源

要想共享内存被其他程序发现,就需要设置key键值,当设置之后,别的程序才可以通过key准确找到这个共享内存。

cpp 复制代码
QSharedMemory::QSharedMemory(const QString &key, QObject *parent = nullptr)
void QSharedMemory::setKey(const QString &key)

所有需要访问的程序持有的共享内存对象,都需要设置同样的key值
QSharedMemory::create 程序A启动 程序A结束 程序B启动 程序B结束 共享内存

上面是正常运行的两个程序

程序A用QSharedMemory::create创建了一个共享内存。

QSharedMemory::create创建之后,会自动QSharedMemory::attach连接上共享内存。

当程序A持有的QSharedMemory对象释放掉或者调用QSharedMemory::detach()都会使程序A与共享内存分离。

如果程序B想要读写共享内存,则调用QSharedMemory::attach连接上共享内存。
QSharedMemory::create QSharedMemory对象释放 QSharedMemory::create QSharedMemory::detach 程序A启动 程序A结束 程序B启动 程序B结束 共享内存 释放共享内存

有一个特别关键需要注意的地方:
程序A启动 程序A结束 程序B启动 程序B结束 共享内存

当所有程序都没有连接共享内存,共享内存将会释放掉 ,这时再想使用这个共享内存就必须重新QSharedMemory::create创建,就和共享指针一样。

还有一些如和别的非Qt程序进行共享内存通信的注意事项等问题,可以看参考文档

实战---代码

读取示例

cpp 复制代码
if (!sharedMemory.attach()) {
    ui.label->setText(tr("Unable to attach to shared memory segment.\n" \
                         "Load an image 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));

写入示例

cpp 复制代码
// 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 memory segment."));
    return;
}
sharedMemory.lock();
char *to = (char*)sharedMemory.data();
const char *from = buffer.data().data();
memcpy(to, from, qMin(sharedMemory.size(), size));
sharedMemory.unlock();
相关推荐
云中飞鸿37 分钟前
QTCreator快捷键
qt
MZ_ZXD0011 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
A星空1232 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
十五年专注C++开发2 小时前
QStyleItemDelegate:自定义列表控件类神器
qt·model·view·delegate
凡人叶枫2 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
会叫的恐龙2 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6013 小时前
C++顺序表和vector
开发语言·c++·算法
独望漫天星辰3 小时前
C++ 多态深度解析:从语法规则到底层实现(附实战验证代码)
开发语言·c++
无小道3 小时前
Qt——事件简单介绍
开发语言·前端·qt
王老师青少年编程4 小时前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)
c++·题解·真题·csp·信奥赛·csp-s·提高组