1

私はQtの初心者であり、実行時にいくつかのアプリケーションを接続するための機能としてQSharedMemoryを使用したいと考えています。QSharedMemoryの例を確認し、使用するために必要なものをすべて抽出しました。

ここでの問題は、QSharedMemoryインスタンスがメモリの割り当てに失敗することです。これを呼び出すcreate()とfalseが返され、に格納されているエラーメッセージを出力すると、次のエラーが表示されerrorString()ます。

QSharedMemory::create: unable to make key

私のコードは次のようになっています。

QSharedMemory sharedmemory;
if(sharedmemory.isAttached())
    sharedmemory.detach();

QString st = "this is the shared data";
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << st;
int size = buffer.size();

if(!sharedmemory.create(size))
{
    std::cout<<sharedmemory.errorString().toStdString()<<std::endl;
    return 1;
}

メソッドに関して何を与えてもsizecreate()メモリを割り当てないだけです。

どんなアイデアでも適用されます。ありがとうMahdi

4

1 に答える 1

1

のソースコードからqsharedmemory_unix.cpp

// build file if needed
int built = createUnixKeyFile(nativeKey);
if (built == -1) {
    errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::create"));
    error = QSharedMemory::KeyError;
    return false;
}

のQtドキュメントからQSharedMemory

QSharedMemory::QSharedMemory ( const QString & key, QObject * parent = 0 )

指定された親とそのキーがkeyに設定された共有メモリオブジェクトを構築します。キーが設定されているため、create()andattach()関数を呼び出すことができます。

setKey()、、、create()およびも参照してくださいattach()


QSharedMemory::QSharedMemory ( QObject * parent = 0 )

この関数はオーバーロードしQSharedMemory()ます。

指定された親との共有メモリオブジェクトを構築します。共有メモリオブジェクトのキーはコンストラクタによって設定されないため、共有メモリオブジェクトには、基になる共有メモリセグメントがアタッチされていません。キーはsetKey()前に設定する必要があります。そうでないcreate()場合attach()は使用できます。

も参照してくださいsetKey()

(強調鉱山)

基本的に、コンストラクタの2番目の形式を使用しており、共有メモリキーを設定していません。QSharedMemoryキー名を付ける必要があります。このキーの意味については、 shm_openを参照してください。Linuxでは、POSIX共有メモリはファイルシステムとして実装されて/dev/shmおり、キー名には特定の制限があることに注意してください。名前の先頭以外にスラッシュ(/)を含めることはできません。これを行うには、ディレクトリを作成する必要があり/dev/shm、両方が必要になるためです。shm_open()そしてQSharedMemory::createUnixKeyFile()そうする気がない。

于 2012-08-08T17:13:17.890 に答える