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();
相关推荐
郭涤生12 小时前
大白话Reactor模式
linux·c++
三月微暖寻春笋12 小时前
【和春笋一起学C++】(五十)在构造函数中使用new时的注意事项
c++·new·构造函数
Chen--Xing12 小时前
LeetCode 49.字母异位词分组
c++·python·算法·leetcode·rust
tang&12 小时前
Qt 基础教程:从初识到信号槽机制
开发语言·qt
_OP_CHEN13 小时前
【算法基础篇】(三十三)动态规划之区间 DP:从回文串到石子合并,吃透区间类问题的万能解法
c++·算法·蓝桥杯·动态规划·算法竞赛·acm/icpc·区间动态规划
刺客xs13 小时前
Qt ---- Qt6.5.3 连接MySQL数据库
数据库·qt·mysql
coderxiaohan13 小时前
【C++】无序容器unordered_set和unordered_map的使用
开发语言·c++
charlie11451419113 小时前
深入理解CC++的编译与链接技术9:动态库细节
c语言·开发语言·c++·学习·动态库
isyoungboy13 小时前
c++使用win新api替代DirectShow驱动uvc摄像头,可改c#驱动
开发语言·c++·c#
世转神风-13 小时前
qt-windows用户点击.exe,报错:缺少libgcc_s_seh-1.dll
c++·qt