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

Qt QSharedMemory:第二个进程无法附加,qt,shared-memory,Qt,Shared Memory,我有两个过程 第一个创建一个带有密钥的QSharedMemory 创建成功,因为没有返回错误 在第二个进程中,我使用与第一个进程相同的密钥名完成了setKey(),然后尝试将attach()附加到共享内存 attach()失败。在共享内存上使用errorString(),将返回以下字符串: QSharedMemory::handle: doesn't exist 平台是Windows 我会错过什么?敬请告知,谢谢。您看过共享内存示例了吗 下面是该示例中的一些代码片段 以下是第一个进程将“大小

我有两个过程

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

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

在第二个进程中,我使用与第一个进程相同的密钥名完成了
setKey()
,然后尝试将
attach()
附加到共享内存

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

QSharedMemory::handle: doesn't exist
平台是Windows


我会错过什么?敬请告知,谢谢。

您看过共享内存示例了吗

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

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

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));
下面是第二个进程想要访问共享内存时发生的情况:

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内核将发布 自动删除共享内存段


希望有帮助。

您看过共享内存示例了吗

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

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

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));
下面是第二个进程想要访问共享内存时发生的情况:

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内核将发布 自动删除共享内存段


希望对您有所帮助。

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

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

我已经查看了示例,是的。在第一个示例中,我创建了内存(创建自动意味着附加),带有一个大小和一个键。在第二个过程中,我尝试使用
setKey()
attach()
连接到共享内存。此时第一个进程正在运行。但是我还是犯了这个错误,我已经在两台不同的窗口机器上成功运行了两次这个示例。在本例中,它不调用
setKey
。相反,它在
对话框
构造函数中使用相同的键构造成员变量
sharedMemory
。当您运行示例而不编辑它时会发生什么?好的。我运行它时没有使用
setKey()
,而是在构造函数中传递了键的名称。同样,它说,无法连接到共享内存,找不到句柄。这是未编辑的示例吗?两个实例同时打开?好的。我明白了。问题是出现了一个游离的
detach()
code,它会在第二个实例连接到sharedMemory之前分离sharedMemory,因此没有要连接的句柄。谢谢你的帮助。我已经看过这个例子了,是的。在第一个示例中,我创建了内存(创建自动意味着附加),带有一个大小和一个键。在第二个过程中,我尝试使用
setKey()
attach()
连接到共享内存。此时第一个进程正在运行。但是我还是犯了这个错误,我已经在两台不同的窗口机器上成功运行了两次这个示例。在本例中,它不调用
setKey
。相反,它在
对话框
构造函数中使用相同的键构造成员变量
sharedMemory
。当您运行示例而不编辑它时会发生什么?好的。我运行它时没有使用
setKey()
,而是在构造函数中传递了键的名称。同样,它说,无法连接到共享内存,找不到句柄。这是未编辑的示例吗?两个实例同时打开?好的。我明白了。问题是出现了一个游离的
detach()
code,它会在第二个实例连接到sharedMemory之前分离sharedMemory,因此没有要连接的句柄。谢谢你的帮助。哪个版本的Windows?哪个版本的Windows?