前言
基于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对象析构,或者程序退出时,如果这是最后一个附加的进程,共享内存段会被系统销毁。所以共享内存对象如果需要持续使用,应定义在全局变量或者类对象里,如果只定义在函数中,函数结束时,该共享内存就会销毁。
6956

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



