QSharedMemory:第二个进程无法附加

时间:2013-02-21 05:09:03

标签: qt shared-memory

我有两个流程。

第一个用密钥创建一个QSharedMemory。

创建成功,因为没有返回错误。

在第二个过程中,我尝试连接到共享内存,使用与第一个进程相同的键名完成setKey(),然后尝试attach()到内存。

attach()失败。在共享内存上使用errorString(),将返回以下字符串:

QSharedMemory::handle: doesn't exist

平台是Windows。

我在这里可以缺少什么?请指教,谢谢。

2 个答案:

答案 0 :(得分:1)

您是否看过共享内存示例?

http://doc-snapshot.qt-project.org/4.8/ipc-sharedmemory.html

以下是该示例中的一些代码段。

以下是第一个将“size”缓冲区放入共享内存的过程:

if (!sharedMemory.create(size)) {
    ui.label->setText(tr("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();

以下是第二个进程想要访问共享内存时发生的情况:

if (!sharedMemory.attach()) {
    ui.label->setText(tr("Unable to attach to shared memory segment.\n" \
             "Load an image first."));
    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();
ui.label->setPixmap(QPixmap::fromImage(image));

另请注意,在示例中,两个进程必须正在运行,并且仍然具有QSharedMemory的实例。以下是文档中描述的内容:

  

Windows:QSharedMemory不“拥有”共享内存段。什么时候   具有QSharedMemory实例的所有线程或进程   附加到特定共享内存段已被破坏   他们的QSharedMemory实例或退出,Windows内核发布   自动共享内存段。

希望有所帮助。

答案 1 :(得分:0)

遇到同样的问题。当第二个二进制文件尝试附加时,确保QSharedMemory对象仍然存在。 如果你想阻止运行相同QT二进制文件的2个实例的能力,只需使用动态内存制作QSharedMemory对象,该动态内存将一直存在,直到app退出。