<QApplicationStatic>
| Header: | #include <QApplicationStatic> |
マクロ
(since 6.3) | Q_APPLICATION_STATIC(Type, VariableName, ...) |
マクロのドキュメント
[since 6.3] Q_APPLICATION_STATIC(Type, VariableName, ...)
このマクロはQ_GLOBAL_STATIC を拡張し、QGlobalStatic 型のグローバルかつ静的なオブジェクト(名前:VariableName )を作成します。このオブジェクトは可変引数によって初期化され、Type へのポインタとして動作します。ここで、この型の実際の存続期間はQCoreApplication にバインドされます。 Q_APPLICATION_STATIC によって作成されたオブジェクトは、最初の使用時に自身を初期化します。つまり、アプリケーションやライブラリのロード時間を増加させることはありません。さらに、このオブジェクトはすべてのプラットフォームにおいてスレッドセーフな方法で初期化されます。
Q_GLOBAL_STATIC では、型はプログラム終了時にのみ破棄されるように設計されていますが、これとは対照的に、ここでは型の実際の存続期間はQCoreApplication の存続期間に紐付けられています。これにより、QCoreApplication が破棄された際に同時に破棄されるべき半静的なQObjectを格納するのに最適です。 つまり、QCoreApplication がdestroyedシグナルを発行すると、この型は削除されます。新しいQCoreApplication も作成されている場合、オブジェクトが再度アクセスされた際に再作成されることが許容されます。
値はQCoreApplication にバインドされているため、有効なQCoreApplication::instance()が存在する場合にのみアクセスすべきです。QCoreApplication が作成される前、または破棄された後にこのオブジェクトにアクセスすると、警告が発生し、予期しない動作を引き起こす可能性があります。
このマクロの一般的な使用法は、グローバルコンテキスト(つまり、関数本体の外)において、以下の通りです:
Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())このマクロに可変引数として渡された引数は、オブジェクトが構築されるたびに評価されることに注意してください。したがって、上記の例では、オブジェクトが再作成されると、関数function が複数回呼び出されます。
値がQCoreApplication のライフタイムに紐付けられる点を除けば、このマクロの挙動はQ_GLOBAL_STATIC()と同一です。詳細については、当該マクロのドキュメントを参照してください。
スレッドに関する保証
Q_APPLICATION_STATIC マクロは、たとえ複数のスレッドがオブジェクトに同時にアクセスしようとしても、そのオブジェクトが(QCoreApplication のライフタイムごとに)一度だけ初期化されることを保証します。 これは、オブジェクトごとにミューテックスを提供することで実現されています。アプリケーションおよびライブラリの開発者は、オブジェクトがこのミューテックスがロックされた状態で構築されることに留意する必要があります。したがって、同じオブジェクトの初期化処理に再進入してはならず、そうするとデッドロックが発生します。
オブジェクトの破棄に関してはスレッドセーフ性が保証されていません。QCoreApplication のデストラクタの実行が開始された後は、ユーザーコードからこのオブジェクトにアクセスしてはなりません。ユーザーコードでは、メインスレッドのイベントループが終了した後はオブジェクトにアクセスしないなど、これが発生しないよう対策を講じる必要があります。
Q_GLOBAL_STATIC と同様に、Q_APPLICATION_STATIC も、作成が完了した後のオブジェクトへのアクセスについて、スレッドセーフ性を保証しません。競合状態となるデータアクセスが発生しないよう確保するのは、ユーザーコードの責任です。
この操作によって作成されたオブジェクトが `QObject` である場合、その関連付けられたスレッドは、作成に成功したスレッドとなります。 このオブジェクトはメインスレッドによって破棄されるため、破棄前にメインスレッドまたはどのスレッドにもmoveToThread()を呼び出すことを推奨します。メインスレッドがオブジェクトを初期化することを保証できない場合は、当該クラスのコンストラクタ内からこれを行うのが妥当な解決策です。
このマクロは Qt 6.3 で導入されました。
Q_GLOBAL_STATIC およびQGlobalStaticも参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.