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 图像传输优化


1979

被折叠的 条评论
为什么被折叠?



