<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 erzeugt 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 erzeugte Objekt initialisiert sich bei der ersten Verwendung selbst, was bedeutet, dass es die Ladezeit der Anwendung oder der Bibliothek nicht erhöht. Außerdem wird das Objekt auf allen Plattformen auf eine thread-sichere Weise initialisiert.
Im Gegensatz zu Q_GLOBAL_STATIC, wo der Typ nur beim Beenden des Programms zerstört werden soll, ist hier die tatsächliche Lebensdauer des Typs an die Lebensdauer des QCoreApplication gebunden. Dies macht es ideal, um semistatische QObjects zu speichern, die ebenfalls zerstört werden sollten, wenn das QCoreApplication zerstört wird. Das bedeutet, dass der Typ gelöscht wird, sobald QCoreApplication das Destroyed-Signal aussendet. Es ist zulässig, dass das Objekt bei einem erneuten Zugriff neu erstellt wird, wenn auch ein neues QCoreApplication erstellt wurde.
Da der Wert an QCoreApplication gebunden ist, sollte auf ihn nur dann zugegriffen werden, wenn ein gültiges QCoreApplication::instance() vorhanden ist. Ein Zugriff auf dieses Objekt, bevor QCoreApplication erstellt oder nachdem es zerstört wurde, führt zu Warnungen und kann zu unvorhersehbarem Verhalten führen.
Die typische Verwendung dieses Makros ist wie folgt, in einem globalen Kontext (d.h. außerhalb von Funktionskörpern):
Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())
Beachten Sie, dass die Argumente, die diesem Makro in variabler Form übergeben werden, jedes Mal ausgewertet werden, wenn das Objekt konstruiert wird, so dass im obigen Beispiel die Funktion function
mehr als einmal aufgerufen wird, wenn das Objekt neu erstellt wird.
Abgesehen davon, dass der Wert auch an die Lebensdauer von QCoreApplication gebunden ist, verhält sich dieses Makro identisch zu Q_GLOBAL_STATIC(). Weitere Informationen zu diesem Makro finden Sie in der Dokumentation des Makros.
Threading-Garantien
Das Makro Q_APPLICATION_STATIC stellt sicher, dass das Objekt nur einmal initialisiert wird (pro Lebenszeit eines QCoreApplication), selbst wenn mehrere Threads gleichzeitig auf das Objekt zugreifen wollen. Dies geschieht durch die Bereitstellung eines Mutex pro Objekt; Anwendungs- und Bibliotheksentwickler müssen sich darüber im Klaren sein, dass ihr Objekt mit gesperrtem Mutex konstruiert wird, und dürfen daher die Initialisierung desselben Objekts nicht wiederholen, da sonst ein Deadlock entsteht.
Es gibt keine Thread-Sicherheit bei der Zerstörung des Objekts: Benutzer-Code darf nicht auf dieses Objekt zugreifen, sobald der QCoreApplication Destruktor zu laufen beginnt. Der Benutzercode muss dafür sorgen, dass dies nicht geschieht, z. B. indem er nicht darauf zugreift, sobald die Ereignisschleife des Hauptthreads beendet ist.
Wie Q_GLOBAL_STATIC bietet auch Q_APPLICATION_STATIC keine Thread-Sicherheitsgarantien für Zugriffe auf das Objekt, nachdem die Erstellung abgeschlossen ist. Es ist Sache des Benutzercodes, dafür zu sorgen, dass keine riskanten Datenzugriffe erfolgen.
Handelt es sich bei dem durch diese Operation erstellten Objekt um QObject, so ist der zugehörige Thread derjenige, der das Objekt erfolgreich erstellt hat. Es wird vom Haupt-Thread zerstört, daher ist eine moveToThread() an den Haupt-Thread oder an keinen Thread vor der Zerstörung ratsam. Dies vom Konstruktor der betreffenden Klasse aus zu tun, ist eine sinnvolle Lösung, wenn man nicht garantieren kann, dass der Hauptthread derjenige ist, der das Objekt initialisiert.
Dieses Makro wurde in Qt 6.3 eingeführt.
Siehe auch Q_GLOBAL_STATIC und QGlobalStatic.
© 2025 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.