转载
初始化
- 实例化QSharedMemory对象
- 指定关键字key
开始通信
- 进程A写:
- 检测该进程是否连接到共享内存段,如果连接,则将该进程与共享内存段分离。
- 从系统足够大的内存中得到一个新的共享内存段。
- 锁定该共享内存段,以阻止第二个对话框进程访问。
- 开始进行写操作。
- 将共享内存段解锁,然后第二个对话框进程就可以访问了。
- 进程B读:
- 将该进程与进程A创建的共享内存段绑定
- 锁定共享内存段。
- 开始进行读操作。
- 将共享内存段解锁,然后将该进程与共享内存段分离。
代码段
- 写
void Dialog::loadFromFile()
{
if (sharedMemory.isAttached())
{
// 将该进程与共享内存段分离
if (!sharedMemory.detach())
qDebug() << "Unable to detach from shared memory.";
}
QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(),
tr("Images (*.png *.xpm *.jpg)"));
QImage image;
if (!image.load(fileName))
{
qDebug() << "Selected file is not an image, please select another.";
return;
}
// 将数据加载到共享内存中
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << image;
int size = buffer.size();
// 创建共享内存段
if (!sharedMemory.create(size))
{
qDebug() << sharedMemory.errorString() << "
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();
}
- 读
void MainWindow::loadFromMemory()
{
// 将共享内存与该进程绑定
if (!sharedMemory.attach())
{
qDebug() << "Unable to attach to shared memory segment.";
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();
m_pLabel->setPixmap(QPixmap::fromImage(image));
}