<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 の寿命に束縛されます。このため、半静的な QObject を格納するのに理想的で、QCoreApplication が破棄されると、QObject も破棄されます。つまり、QCoreApplication が破棄シグナルを発すると、型は削除されます。新しいQCoreApplication が作成されていれば、再度アクセスされたときにオブジェクトを再作成することができます。
この値はQCoreApplication にバインドされているため、有効なQCoreApplication::instance() が存在する場合にのみアクセスする必要がある。QCoreApplication が作成される前や破棄された後にこのオブジェクトにアクセスすると、警告が表示され、予測できない動作が発生する可能性があります。
このマクロの典型的な使い方は、グローバル・コンテキスト(つまり、関数本体の外)での次のようなものです:
Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())
このマクロにvariadicで渡された引数は、オブジェクトが構築されるたびに評価されるので、上記の例では、オブジェクトが再作成されると、関数function
が複数回呼び出されることに注意してください。
値がQCoreApplication のライフタイムにバインドされることを除けば、このマクロはQ_GLOBAL_STATIC() と同じように動作する。詳細については、このマクロのドキュメントを参照してください。
スレッド保証
Q_APPLICATION_STATIC マクロは、複数のスレッドがオブジェクトに同時にアクセスしようとしても、オブジェクトの初期化が(QCoreApplication のライフタイムごとに)1 回しか行われないことを保証します。アプリケーションやライブラリの開発者は、自分のオブジェクトがこのミューテックスをロックした状態で構築されることを認識する必要があり、したがって、同じオブジェクトの初期化に再入力してはなりません。
オブジェクトの破棄にはスレッドセーフがありません。QCoreApplication デストラクタの実行が始まったら、ユーザーコードはこのオブジェクトにアクセスしてはいけません。ユーザー・コードは、メイン・スレッドのイベント・ループが終了したら、このオブジェクトにアクセスしないなど、このようなことが起こらないように調整する必要があります。
Q_GLOBAL_STATIC と同様、Q_APPLICATION_STATIC は、生成終了後のオブジェクトへのアクセスに対するスレッドセーフティを保証しません。不正なデータ・アクセスが起こらないようにするのはユーザー・コード次第です。
この操作によって生成されたオブジェクトがQObject の場合、その関連スレッドはオブジェクトの生成に成功したスレッドとなる。このオブジェクトはメイン・スレッドによって破棄されるため、破棄する前にメイン・スレッド、またはスレッドを持たないスレッドにmoveToThread ()することをお勧めします。メインスレッドがオブジェクトを初期化するスレッドであることを保証できない場合は、問題のクラスのコンストラクタからこれを行うのが賢明な解決策です。
このマクロは Qt 6.3 で導入されました。
Q_GLOBAL_STATIC とQGlobalStaticも参照して ください。
ここに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。