1

我有 2 个进程。

第一个使用密钥创建 QSharedMemory。

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

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

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

QSharedMemory::handle: doesn't exist

平台是 Windows。

我在这里能错过什么?请指教,谢谢。

4

2 回答 2

1

你看过共享内存的例子吗?

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

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

这是第一个进程将“大小”缓冲区放入共享内存的操作:

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 内核会自动释放共享内存段。

希望有帮助。

于 2013-02-21T06:47:48.873 回答
0

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

于 2013-07-25T14:00:23.823 回答