首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSharedMemory :无法附加第二个进程

QSharedMemory :无法附加第二个进程
EN

Stack Overflow用户
提问于 2013-02-21 13:09:03
回答 2查看 6.7K关注 0票数 1

我有两个进程。

第一个创建一个带有密钥的QSharedMemory。

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

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

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

代码语言:javascript
复制
QSharedMemory::handle: doesn't exist

平台为Windows。

我还能错过什么呢?敬请指教,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-21 14:47:49

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

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

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

下面是第一个进程将一个“大小”的缓冲区放入共享内存的过程:

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
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实例。以下是文档中对它的描述:

窗口: QSharedMemory并不“拥有”共享内存段。当将QSharedMemory实例附加到特定共享内存段的所有线程或进程都销毁了它们的QSharedMemory实例或退出时,Windows内核会自动释放该共享内存段。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2013-07-25 22:00:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14994970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档