<QApplicationStatic>
| Header: | #include <QApplicationStatic> |
Makros
(since 6.3) | Q_APPLICATION_STATIC(Type, VariableName, ...) |
Makro-Dokumentation
[since 6.3] Q_APPLICATION_STATIC(Type, VariableName, ...)
Dieses Makro erweitert „ Q_GLOBAL_STATIC “ und erstellt ein globales und statisches Objekt vom Typ „ QGlobalStatic “ mit dem Namen „ VariableName “, das durch die variadischen Argumente initialisiert wird und sich wie ein Zeiger auf „ Type “ verhält, wobei die tatsächliche Lebensdauer des Typs an „ QCoreApplication “ gebunden ist. Das von `Q_APPLICATION_STATIC` erstellte Objekt initialisiert sich bei der ersten Verwendung selbst, was bedeutet, dass es die Ladezeit der Anwendung oder der Bibliothek nicht verlängert. Zudem wird das Objekt auf allen Plattformen threadsicher initialisiert.
Im Gegensatz zu ` Q_GLOBAL_STATIC `, bei dem der Typ erst beim Programmende zerstört werden soll, ist hier die tatsächliche Lebensdauer des Typs an die Lebensdauer des ` QCoreApplication` gebunden. Dies macht ihn ideal zum Speichern von semistatischen `QObjects`, die ebenfalls zerstört werden sollen, sobald das ` QCoreApplication ` zerstört wird. Das bedeutet, dass der Typ gelöscht wird, sobald das „ QCoreApplication “ das Signal „destroyed“ aussendet. Es ist zulässig, dass das Objekt neu erstellt wird, wenn erneut darauf zugegriffen wird, sofern auch ein neues „ QCoreApplication “ erstellt wurde.
Da der Wert an das ` QCoreApplication` gebunden ist, sollte darauf nur zugegriffen werden, wenn ein gültiges ` QCoreApplication::instance()` vorhanden ist. Der Zugriff auf dieses Objekt, bevor ` QCoreApplication ` erstellt wurde oder nachdem es zerstört wurde, führt zu Warnungen und kann unvorhersehbares Verhalten zur Folge haben.
Die typische Verwendung dieses Makros sieht wie folgt aus, in einem globalen Kontext (d. h. außerhalb von Funktionskörpern):
Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())Beachten Sie, dass die variadisch an dieses Makro übergebenen Argumente bei jeder Erstellung des Objekts ausgewertet werden; im obigen Beispiel wird die Funktion ` function ` daher mehr als einmal aufgerufen, wenn das Objekt neu erstellt wird.
Abgesehen davon, dass der Wert ebenfalls an die Lebensdauer von ` QCoreApplication` gebunden ist, verhält sich dieses Makro identisch wie ` Q_GLOBAL_STATIC()`. Weitere Informationen finden Sie in der Dokumentation zu diesem Makro.
Garantien bei der Thread-Verarbeitung
Das Makro `Q_APPLICATION_STATIC` stellt sicher, dass das Objekt nur einmal (pro Lebensdauer eines ` QCoreApplication`) initialisiert wird, selbst wenn mehrere Threads gleichzeitig versuchen, auf das Objekt zuzugreifen. Dies wird durch die Bereitstellung eines objektbezogenen Mutex erreicht; Anwendungs- und Bibliotheksentwickler müssen sich bewusst sein, dass ihr Objekt mit gesperrtem Mutex erstellt wird und daher die Initialisierung desselben Objekts nicht erneut aufrufen dürfen, da sonst ein Deadlock auftritt.
Bei der Zerstörung des Objekts besteht keine Thread-Sicherheit: Der Anwendercode darf nicht mehr auf dieses Objekt zugreifen, sobald der Destruktor von ` QCoreApplication ` ausgeführt wird. Der Anwendercode muss dafür sorgen, dass dies nicht geschieht, beispielsweise indem er nicht mehr darauf zugreift, sobald die Ereignisschleife des Hauptthreads beendet ist.
Wie „ Q_GLOBAL_STATIC “ bietet auch „Q_APPLICATION_STATIC“ keine Garantien für Thread-Sicherheit bei Zugriffen auf das Objekt, sobald dessen Erstellung abgeschlossen ist. Es obliegt dem Benutzercode, sicherzustellen, dass keine konkurrierenden Datenzugriffe stattfinden.
Falls das durch diesen Vorgang erstellte Objekt ein ` QObject` ist, ist der zugehörige Thread derjenige, bei dem die Erstellung erfolgreich war. Es wird vom Hauptthread zerstört, daher ist es ratsam, vor der Zerstörung einen Aufruf von ` moveToThread()` an den Hauptthread oder an keinen Thread zu senden. Dies im Konstruktor der betreffenden Klasse zu tun, ist eine sinnvolle Lösung, wenn nicht garantiert werden kann, dass der Hauptthread das Objekt initialisiert.
Dieses Makro wurde in Qt 6.3 eingeführt.
Siehe auch „ Q_GLOBAL_STATIC “ und „ 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.