1

2つのプロセスがあります。

1つ目は、キーを使用してQSharedMemoryを作成します。

エラーが返されないため、作成は成功します。

setKey()2番目のプロセスでは、最初のプロセスと同じキー名を使用して共有メモリに接続してから、メモリに接続しようと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();

2番目のプロセスが共有メモリにアクセスする場合は次のようになります。

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

同じ問題が発生しました。2番目のバイナリがアタッチしようとしたときに、QSharedMemoryオブジェクトがまだ存続していることを確認してください。同じQTバイナリの2つのインスタンスを実行する機能をブロックする場合は、アプリが終了するまで存続する動的メモリを使用してQSharedMemoryオブジェクトを作成するだけです。

于 2013-07-25T14:00:23.823 に答える