Qt编程:QSharedMemory 详解

SharedMemory 概述

      QSharedMemory 是 Qt 提供的共享内存类,用于在多个进程间共享数据。它是 Qt 进程间通信(IPC)机制之一,特别适合大量数据的快速共享。

1. 主要特点:

  • 跨平台:支持 Windows、Linux、macOS 等

  • 高效:直接内存访问,无需序列化/反序列化

  • 容量大:适合传输图像、视频帧等大型数据

  • 进程隔离:不同进程可以安全访问同一内存区域

2. 核心功能

2.1 基本操作
// 创建共享内存段
QSharedMemory shared("MySharedMemory");
shared.create(1024); // 创建1KB大小的共享内存

// 附加到现有共享内存
QSharedMemory shared("MySharedMemory");
shared.attach();

// 分离共享内存
shared.detach();

// 检查是否已附加
if(shared.isAttached()) {
    // 已附加到共享内存
}
2.2 数据访问
// 写入数据
shared.lock();
char *to = (char*)shared.data();
strcpy(to, "Hello Shared Memory");
shared.unlock();

// 读取数据
shared.lock();
const char *from = (const char*)shared.constData();
qDebug() << "Data:" << from;
shared.unlock();

3. 关键方法详解

3.1 create(size_t size, AccessMode mode = ReadWrite)
  • 创建大小为 size 字节的新共享内存段

  • mode 指定访问模式:QSharedMemory::ReadOnly 或 QSharedMemory::ReadWrite

  • 返回 true 表示成功,false 表示失败

3.2 attach(AccessMode mode = ReadWrite)
  • 附加到已存在的共享内存段

  • 必须调用成功后才能访问数据

3.3 detach()
  • 从共享内存段分离

  • 不会删除共享内存段,只是断开当前进程的连接

3.4 lock() / unlock()
  • 提供对共享内存的互斥访问

  • 必须成对使用,确保线程安全

3.5 data() / constData()
  • 返回指向共享内存数据的指针

  • data() 可读写,constData() 只读

4. 错误处理

QSharedMemory 提供错误检测机制:

if(!shared.create(1024)) {
    switch(shared.error()) {
    case QSharedMemory::AlreadyExists:
        qDebug() << "共享内存已存在";
        break;
    case QSharedMemory::NotFound:
        qDebug() << "共享内存不存在";
        break;
    case QSharedMemory::LockError:
        qDebug() << "锁定失败";
        break;
    case QSharedMemory::OutOfResources:
        qDebug() << "资源不足";
        break;
    case QSharedMemory::PermissionDenied:
        qDebug() << "权限不足";
        break;
    case QSharedMemory::SizeError:
        qDebug() << "大小错误";
        break;
    case QSharedMemory::UnknownError:
    default:
        qDebug() << "未知错误";
    }
}

5. 实际应用示例

5.1 进程间通信模型
// 写入进程
QSharedMemory writer("SharedData");
if(writer.create(1024)) {
    writer.lock();
    sprintf((char*)writer.data(), "Process 1: %d", QDateTime::currentSecsSinceEpoch());
    writer.unlock();
}

// 读取进程
QSharedMemory reader("SharedData");
if(reader.attach()) {
    reader.lock();
    qDebug() << "Received:" << (const char*)reader.constData();
    reader.unlock();
    reader.detach();
}
5.2 图像传输优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值