共享内存[QT]

前言

基于QT,简单实现共享内存。

详述

共享内存可以实现进程间通过共享内存进行高效数据通信,两个不同的软件之间也可以。

这个示例包含两个独立的Qt程序:写入端负责创建共享内存并写入数据;读取端则附加到该内存段读取数据。

//写入端文件代码
	// 1. 创建共享内存对象并设置唯一键
    QSharedMemory sharedMemory;
    sharedMemory.setKey("MySharedMemoryKey"); // 读取端也需用此键
	// 2. 尝试创建指定大小的共享内存段 (例如 1024 字节)
    sharedMemory.create(1024, QSharedMemory::ReadWrite);
    // 3. 准备要共享的数据 (这里使用一个QString和整数)
    QString message = "Hello from Qt Shared Memory Producer!";
    int counter = 0;
    // 4. 使用QBuffer和QDataStream序列化数据
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite); // 打开缓冲区进行读写
    QDataStream stream(&buffer);
    // 将消息和计数器写入数据流
    stream << message << ++counter;
    // 5. 将序列化后的数据写入共享内存
    // 先锁定共享内存,防止读取端在写入过程中访问
    sharedMemory.lock();
    // 获取共享内存的数据指针
    char *const sharedMemoryData = static_cast<char*>(sharedMemory.data());
    // 将缓冲区中的数据复制到共享内存
    memcpy(sharedMemoryData, buffer.data().constData(), dataSize);
    // 解锁共享内存,允许读取端访问
    sharedMemory.unlock();
    // 6. 清理:从共享内存段分离
    // 当此QSharedMemory对象析构,或者程序退出时,如果这是最后一个附加的进程,共享内存段会被系统销毁。
    sharedMemory.detach();
//读取端文件代码
	// 1. 创建共享内存对象并设置唯一键
    QSharedMemory sharedMemory;
    sharedMemory.setKey("MySharedMemoryKey"); // 读取端也需用此键
	// 2. 尝试附加到已存在的共享内存段
    sharedMemory.attach(QSharedMemory::ReadOnly); // 读取端通常只需要只读访问
    // 3. 从共享内存中读取数据
    // 锁定共享内存以确保数据读取的一致性
    QString receivedMessage = "";
    int receivedCounter = 0;
    sharedMemory.lock();
    // 获取共享内存的数据指针和大小
    const char *const sharedMemoryData = static_cast<const char*>(sharedMemory.constData());
    const int sharedMemorySize = sharedMemory.size();

    // 使用QBuffer和QDataStream反序列化数据
    QBuffer buffer;
    buffer.setData(sharedMemoryData, sharedMemorySize); // 将共享内存数据设置到缓冲区
    buffer.open(QBuffer::ReadOnly); // 以只读模式打开缓冲区
    QDataStream stream(&buffer);
    // 从数据流中提取消息和计数器
    stream >> receivedMessage >> receivedCounter;
    sharedMemory.unlock(); // 解锁共享内存

    // 4. 输出读取到的数据
    qDebug() << "Data read from shared memory:";
    qDebug() << "  Message:" << receivedMessage;
    qDebug() << "  Counter:" << receivedCounter;
    // 5. 清理:从共享内存段分离
    // 当此QSharedMemory对象析构,或者程序退出时,如果这是最后一个附加的进程,共享内存段会被系统销毁。
    sharedMemory.detach();
结束语

当此QSharedMemory对象析构,或者程序退出时,如果这是最后一个附加的进程,共享内存段会被系统销毁。所以共享内存对象如果需要持续使用,应定义在全局变量或者类对象里,如果只定义在函数中,函数结束时,该共享内存就会销毁。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值