QSharedMemory Class
QSharedMemory クラスは、共有メモリー・セグメントへのアクセスを提供します。詳細...
Header: | #include <QSharedMemory> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Inherits: | QObject |
パブリック型
enum | AccessMode { ReadOnly, ReadWrite } |
enum | SharedMemoryError { NoError, PermissionDenied, InvalidSize, KeyError, AlreadyExists, …, UnknownError } |
パブリック関数
QSharedMemory(const QString &key, QObject *parent = nullptr) | |
QSharedMemory(QObject *parent = nullptr) | |
QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr) | |
virtual | ~QSharedMemory() |
bool | attach(QSharedMemory::AccessMode mode = ReadWrite) |
const void * | constData() const |
bool | create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite) |
void * | data() |
const void * | data() const |
bool | detach() |
QSharedMemory::SharedMemoryError | error() const |
QString | errorString() const |
bool | isAttached() const |
QString | key() const |
bool | lock() |
(since 6.6) QNativeIpcKey | nativeIpcKey() const |
QString | nativeKey() const |
void | setKey(const QString &key) |
(since 6.6) void | setNativeKey(const QNativeIpcKey &key) |
void | setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs()) |
qsizetype | size() const |
bool | unlock() |
詳細説明
QSharedMemory は、複数のスレッドやプロセスによる共有メモリセグメントへのアクセスを提供します。共有メモリセグメントは、QNativeIpcKey で表されるキーによって識別されます。キーは、platformSafeKey() を使用することで、クロスプラットフォームで作成できます。
1 つの QSharedMemory オブジェクトがセグメントをcreate() する必要があり、この呼び出しによってセグメントのサイズが指定されます。他のすべてのプロセスは、すでに存在するはずのセグメントに対してattach() を実行するだけです。どちらの操作が成功しても、アプリケーションはdata() を呼び出して、データへのポインタを取得できます。
unlock非アトミック操作をサポートするために、QSharedMemory は排他アクセスを得るための API を提供しています。共有メモリからの読み取りや共有メモリへの書き込みを行う前に、lock() で共有メモリをロックすることができます。
デフォルトでは、QSharedMemory は、セグメントから QSharedMemory の最後のインスタンスdetached が削除され、セグメントへの参照がなくなると、共有メモリ・セグメントを自動的に破棄します。
キーの種類、プラットフォーム固有の制限、古いアプリケーションや Qt 以外のアプリケーションとの相互運用性の詳細については、Native IPC Keys のドキュメントを参照してください。これには、Apple App Store経由で入手したすべてのアプリを含む、Appleプラットフォーム上のサンドボックス・アプリケーションに関する重要な情報も含まれています。
プロセス間通信と QSystemSemaphoreも参照してください 。
メンバ型のドキュメント
enum QSharedMemory::AccessMode
定数 | 値 | 説明 |
---|---|---|
QSharedMemory::ReadOnly | 0 | 共有メモリセグメントは読み取り専用である。共有メモリ・セグメントへの書き込みは許可されていません。ReadOnlyで作成された共有メモリ・セグメントへの書き込みを試みると、プログラムが異常終了する。 |
QSharedMemory::ReadWrite | 1 | 共有メモリ・セグメントの読み取りと書き込みの両方が許可されています。 |
enum QSharedMemory::SharedMemoryError
定数 | 値 | 説明 |
---|---|---|
QSharedMemory::NoError | 0 | エラーは発生しませんでした。 |
QSharedMemory::PermissionDenied | 1 | 呼び出し元が必要な権限を持っていなかったため、操作に失敗しました。 |
QSharedMemory::InvalidSize | 2 | 要求されたサイズが無効なため、作成操作に失敗しました。 |
QSharedMemory::KeyError | 3 | キーが無効なため、操作に失敗しました。 |
QSharedMemory::AlreadyExists | 4 | 指定されたキーを持つ共有メモリ・セグメントが既に存在したため、create() 操作に失敗しました。 |
QSharedMemory::NotFound | 5 | 指定されたキーを持つ共有メモリ・セグメントが見つからなかったため、attach() 操作に失敗しました。 |
QSharedMemory::LockError | 6 | create() またはattach() が失敗して false を返したか、QSystemSemaphore::acquire() でシステム・エラーが発生したため、共有メモリ・セグメントのlock() の試行に失敗しました。 |
QSharedMemory::OutOfResources | 7 | 要求を満たすのに十分なメモリがないため、create() 操作に失敗しました。 |
QSharedMemory::UnknownError | 8 | 他の何かが発生し、それが悪かった。 |
メンバ関数ドキュメント
QSharedMemory::QSharedMemory(const QString &key, QObject *parent = nullptr)
指定されたparent と、レガシー・キーがkey に設定された共有メモリ・オブジェクトを構築する。 キーが設定されているため、create() およびattach() 関数を呼び出すことができる。
setKey()、create()、attach()も参照 。
QSharedMemory::QSharedMemory(QObject *parent = nullptr)
この関数は、QSharedMemory() をオーバーロードします。
与えられたparent で共有メモリ・オブジェクトを構築します。共有メモリ・オブジェクトのキーはコンストラクタによって設定されないため、共有メモリ・オブジェクトは、その下にある共有メモリ・セグメントを持ちません。create() またはattach() を使用する前に、setNativeKey() でキーを設定する必要があります。
setNativeKey()も参照 。
QSharedMemory::QSharedMemory(const QNativeIpcKey &key, QObject *parent = nullptr)
これはオーバーロードされた関数です。
指定されたparent と、そのキーがkey に設定された共有メモリ・オブジェクトを構築します。 キーが設定されているため、create() およびattach() 関数を呼び出すことができます。
setNativeKey()、create()、attach()も参照してください 。
[virtual noexcept]
QSharedMemory::~QSharedMemory()
デストラクタはキーをクリアし、共有メモリ・オブジェクトをその基礎となる共有メモリ・セグメントから強制的にdetach 取り除きます。この共有メモリ・オブジェクトが共有メモリ・セグメントに接続されている最後のものである場合、detach ()操作によって共有メモリ・セグメントが破棄されます。
detach() およびisAttached()も参照のこと 。
bool QSharedMemory::attach(QSharedMemory::AccessMode mode = ReadWrite)
コンストラクタまたはsetNativeKey() の呼び出しに渡されたキーで識別される共有メモリ・セグメント に、プロセスをアタッチしようとする。アクセスmode は、デフォルトではReadWrite である。ReadOnly にすることもできる。アタッチ操作が成功した場合はtrue
を返す。false が返された場合は、error() を呼び出して、どのエラーが発生したかを調べます。共有メモリ・セグメントをアタッチした後、data() を呼び出すと、共有メモリへのポインタを取得できます。
isAttached()、detach()、create()も参照 。
const void *QSharedMemory::constData() const
共有メモリ・セグメントがアタッチされていれば、その内容への const ポインタを返す。そうでない場合は null を返す。この関数が返す値は、detach が発生するまで変更されないので、このポインタを保存しておいても安全である。
unlockメモリ操作がアトミックでない場合は、読み書きする前にlock() で共有メモリをロックしてもよい。
bool QSharedMemory::create(qsizetype size, QSharedMemory::AccessMode mode = ReadWrite)
コンストラクタに渡されたキーまたはsetNativeKey() で設定されたキーを使用して、size バイトの共有メモリ・セグメントを作成し、指定されたアクセスmode で新しい共有メモリ・セグメントにアタッチして、true
を返します。キーで識別される共有メモリセグメントが既に存在する場合、アタッチ操作は実行されず、false
が返される。戻り値がfalse
の場合、error() を呼び出して、どのエラーが発生したかを判断する。
error()も参照のこと 。
void *QSharedMemory::data()
共有メモリ・セグメントがアタッチされていれば、その内容へのポインタを返す。そうでない場合は null を返す。この関数が返す値は、detach が発生するまで変化しないので、このポインタを保存しておいても安全である。
unlockメモリ操作がアトミックでない場合は、読み書きする前にlock() で共有メモリをロックしてもよい。
attach()も参照のこと 。
const void *QSharedMemory::data() const
この関数は data() をオーバーロードする。
bool QSharedMemory::detach()
共有メモリ・セグメントからプロセスをデタッチする。このプロセスが共有メモリ・セグメントに最後にアタッチされたプロセスであった場合、共有メモリ・セグメントはシステムによって解放されます。共有メモリ・セグメントをデタッチした場合、この関数はtrue
を返す。この関数がfalse
を返す場合は、通常、セグメントがアタッチされていないか、他のプロセスによってロックされていることを意味します。
attach() およびisAttached()も参照のこと 。
QSharedMemory::SharedMemoryError QSharedMemory::error() const
エラーが発生したかどうか、発生した場合はどのエラーであったかを示す値を返す。
errorString() も参照 。
QString QSharedMemory::errorString() const
最後に発生したエラーの説明をテキストで返します。error() がerror value を返した場合、この関数を呼び出して、エラーの内容を示すテキスト文字列を取得する。
error()も参照 。
bool QSharedMemory::isAttached() const
このプロセスが共有メモリ・セグメントにアタッチされている場合、true
を返す。
QString QSharedMemory::key() const
この共有メモリにsetKey() で割り当てられたレガシー・キー、またはキーが割り当てられていない場合、またはセグメントがnativeKey() を使用している場合はヌル・キーを返します。キーは、Qt アプリケーションが共有メモリセグメントを識別するために使用する識別子です。
nativeKey() を呼び出すことで、オペレーティング・システムによって使用される、プラットフォーム固有のネイティブ・キーを見つけることができます。
setKey() およびsetNativeKey()も参照して ください。
bool QSharedMemory::lock()
これは、このプロセスによるアクセス用に共有メモリ・セグメントをロックし、true
を返すセマフォである。他のプロセスがセグメントをロックした場合、この関数はロックが解放されるまでブロックする。その後、ロックを取得し、true
を返します。この関数がfalse
を返す場合は、create() またはattach() からの偽リターンを無視したか、setNativeKey() でキーを設定したか、不明なシステム・エラーによりQSystemSemaphore::acquire() が失敗したことを意味する。
unlock()、data()、QSystemSemaphore::acquire()も参照 。
[since 6.6]
QNativeIpcKey QSharedMemory::nativeIpcKey() const
この共有メモリ・オブジェクトのキー・タイプを返します。キー・タイプは、オペレーティング・システムが共有メモリ・セグメントを識別するために使用する識別子としてnativeKey() を補完する。
ネイティブ・キーを使用して、Qt によって作成されていない共有メモリ・セグメントにアクセスしたり、Qt 以外のアプリケーションに共有メモリ・アクセスを許可したりすることができます。詳細はネイティブ IPC キーを参照してください。
この関数は Qt 6.6 で導入されました。
nativeKey() およびsetNativeKey()も参照してください 。
QString QSharedMemory::nativeKey() const
この共有メモリ・オブジェクトの、プラットフォーム固有のネイティブ・キーを返します。ネイティブ・キーは、オペレーティング・システムが共有メモリ・セグメントを識別するために使用する識別子です。
ネイティブ・キーを使用して、Qt によって作成されていない共有メモリ・セグメントにアクセスしたり、Qt 以外のアプリケーションに共有メモリ・アクセスを許可したりすることができます。詳しくはネイティブ IPC キーを参照してください。
setNativeKey() およびnativeIpcKey()も参照してください 。
void QSharedMemory::setKey(const QString &key)
これはオーバーロードされた関数です。
この共有メモリオブジェクトのレガシーkey を設定します。key が現在のキーと同じ場合、この関数は何もせずに戻ります。そうでない場合、共有メモリ・オブジェクトが基礎となる共有メモリ・セグメントにアタッチされていれば、新しいキーを設定する前に、detach 。この関数は、attach ()を実行しません。
レガシー・キーを取得するには、key ()を呼び出します。この関数は
shm.setNativeKey(QSharedMemory::legacyNativeKey(key));
ただし、key()を使用してレガシー・キーを取得できる点は異なる。
key ()、nativeKey ()、isAttached ()も参照 。
[since 6.6]
void QSharedMemory::setNativeKey(const QNativeIpcKey &key)
この共有メモリ・オブジェクトに、プラットフォーム固有のネイティブ・キーkey を設定する。key が現在のネイティブ・キーと同じ場合、この関数は何もせずに戻ります。そうでない場合、共有メモリ・オブジェクトが基盤となる共有メモリ・セグメントにアタッチされていれば、新しいキーを設定する前に、そのセグメントからdetach を取得します。この関数は、attach ()を行いません。
この関数は、ネイティブ・キーが他のプロセスから共有された場合に便利です。詳細は「ネイティブIPCキー」を参照。
ポータブル・ネイティブ・キーは、platformSafeKey() を使用して取得できます。
nativeKey() を呼び出すと、ネイティブ・キーを取得できます。
この関数はQt 6.6で導入されました。
nativeKey(),nativeIpcKey(),isAttached()も参照してください 。
void QSharedMemory::setNativeKey(const QString &key, QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs())
type 型の共有メモリ・オブジェクトに、プラットフォーム固有のネイティブ・キーkey を設定します(type パラメータは Qt 6.6 以降で利用可能です)。key が現在のネイティブ・キーと同じ場合、関数は何もせずに戻ります。そうでない場合、共有メモリオブジェクトが基礎となる共有メモリセグメントにアタッチされていれば、新しいキーを設定する前に、detach 。この関数は、attach ()を実行しない。
この関数は、ネイティブ・キーが他のプロセスから共有された場合に便利であるが、アプリケーションはキー・タイプが他のプロセスが期待するものと一致するように注意しなければならない。詳細は「ネイティブIPCキー」を参照。
ポータブル・ネイティブ・キーは、platformSafeKey()を使用して取得できる。
nativeKey() を呼び出すと、ネイティブ・キーを取得できる。
nativeKey()、nativeIpcKey()、isAttached()も参照 。
qsizetype QSharedMemory::size() const
接続されている共有メモリ・セグメントのサイズを返します。共有メモリ・セグメントがアタッチされていない場合は、0 が返される。
注意: セグメントのサイズは、create() に渡された要求サイズよりも大きい可能性があります。
bool QSharedMemory::unlock()
共有メモリ・セグメントのロックを解放し、そのロックが現在このプロセスによって保持されて いる場合は、true
を返す。セグメントがロックされていない場合、またはロックが他のプロセスによって保持されている場合は、何も起こらず、false が返されます。
lock()も参照してください 。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。