QtTaskTree::Storage Class
template <typename StorageStruct> class QtTaskTree::StorageEine Klassenvorlage für den benutzerdefinierten Datenaustausch im Baum der laufenden Aufgaben. Mehr...
| Header: | #include <qtasktree.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS TaskTree) target_link_libraries(mytarget PRIVATE Qt6::TaskTree) |
| qmake: | QT += tasktree |
| Seit: | Qt 6.11 |
| Erbt von: | QtTaskTree::StorageBase |
| Status: | Technologievorschau |
Diese Klasse befindet sich in der Technologievorschau und kann sich noch ändern.
Hinweis: Alle Funktionen dieser Klasse sind reentrant.
Öffentliche Funktionen
| Storage() | |
| Storage(const FirstArg &firstArg, const Args &... args) | |
| StorageStruct * | activeStorage() const |
| StorageStruct & | operator*() const |
| StorageStruct * | operator->() const |
Ausführliche Beschreibung
Die Klassenvorlage „Storage“ ist für die dynamische Erstellung und Löschung von Objekten des benutzerdefinierten Typs „ StorageStruct “ zuständig. Die Erstellung und Löschung werden vom laufenden Aufgabenbaum verwaltet. Befindet sich ein „Storage“-Objekt in einem „ Group “-Element, erstellt der laufende Aufgabenbaum das „ StorageStruct “-Objekt beim Start der Gruppe und bevor der Einrichtungshandler der Gruppe aufgerufen wird. Später, wann immer ein Handler innerhalb dieser Gruppe aufgerufen wird, aktiviert der Aufgabenbaum die zuvor erstellte Instanz des Objekts „ StorageStruct “. Dies umfasst alle Setup- und Done-Handler von Aufgaben und Gruppen innerhalb der Gruppe, in der das „Storage“-Objekt platziert wurde, auch innerhalb der verschachtelten Gruppen. Wenn eine Kopie des „Storage“-Objekts über die Lambda-Erfassung an den Handler übergeben wird, kann der Handler über die Methoden „ Storage::operator->()“, „ Storage::operator*()“ oder „ activeStorage()“ auf die vom laufenden Aufgabenbaum aktivierte Instanz zugreifen. Wenn zwei Handler dasselbe „Storage“-Objekt erfassen, kann einer von ihnen dort benutzerdefinierte Daten speichern und der andere diese anschließend lesen. Wenn die Gruppe beendet ist, wird die zuvor erstellte Instanz des „ StorageStruct “-Objekts zerstört, nachdem der „done“-Handler der Gruppe aufgerufen wurde.
Ein Beispiel für den Datenaustausch zwischen Aufgaben:
const Storage<QString> storage;
const auto onFirstDone = [storage](const FirstWorker &task) {
// Assings QString, taken from the first task result, to the active QString instance
// of the Storage object.
*storage = task.getResultAsString();
};
const auto onSecondSetup = [storage](SecondWorker &task) {
// Reads QString from the active QString instance of the Storage object and use it to
// configure the second task before start.
task.configureWithString(*storage);
};
const Group root {
// The running task tree creates QString instance when root in entered
storage,
// The done handler of the first task stores the QString in the storage
FirstWorkerTask(..., onFirstDone),
// The setup handler of the second task reads the QString from the storage
SecondWorkerTask(onSecondSetup, ...)
};Da die Stammgruppe ihre Aufgaben nacheinander ausführt, wird der ` onFirstDone `-Handler immer vor dem ` onSecondSetup `-Handler aufgerufen. Das bedeutet, dass die Daten in ` QString `, die im Körper des ` onSecondSetup `-Handlers aus ` storage ` gelesen werden, bereits durch den ` onFirstDone `-Handler gesetzt wurden. Darauf können Sie sich im Ausführungsmodus „ sequential “ stets verlassen.
Die internen Daten des „Storage“-Objekts werden von allen seinen Kopien gemeinsam genutzt. Aus diesem Grund verweisen die Kopien des „Storage“-Objekts innerhalb der Lambda-Captures der Handler weiterhin auf dieselbe „Storage“-Instanz. Sie können mehrere „Storage“-Objekte in ein „ Group “-Element einfügen, sofern diese keine Kopien desselben „Storage“-Objekts enthalten. Andernfalls wird zur Laufzeit ein Assert ausgelöst, das eine Fehlermeldung enthält. Sie können jedoch Kopien desselben „Storage“-Objekts in verschiedenen „ Group “-Elementen desselben Rezepts platzieren. In diesem Fall erstellt der ausgeführte Aufgabenbaum mehrere Instanzen der „ StorageStruct “-Objekte (eine für jede Kopie), und es findet ein Speicher-Shadowing statt. Das Speicher-Shadowing funktioniert ähnlich wie das Variablen-Shadowing in C++ innerhalb verschachtelter Codeblöcke:
Storage<QString> storage;
const Group root {
storage, // Top copy, 1st instance of StorageStruct
onGroupSetup([storage] { ... }), // Top copy is active
Group {
storage, // Nested copy, 2nd instance of StorageStruct,
// shadows Top copy
onGroupSetup([storage] { ... }) // Nested copy is active
},
Group {
onGroupSetup([storage] { ... }) // Top copy is active
}
};Die „Storage“-Objekte können auch dazu verwendet werden, die Ausgangsdaten an den ausgeführten Aufgabenbaum zu übergeben und die Enddaten aus dem Aufgabenbaum auszulesen, bevor dieser beendet ist. Verwenden Sie dazu jeweils „ onStorageSetup()“ oder „ onStorageDone()“.
Hinweis: Wenn Sie innerhalb des Handlers ein nicht erreichbares „Storage“-Objekt verwenden, weil Sie vergessen haben, den Speicher im Rezept zu platzieren, oder ihn zwar platziert haben, jedoch nicht in der Vorläufergruppe eines Handlers, ist mit einem Absturz zu rechnen, dem folgende Meldung vorausgeht: Der referenzierte Speicher ist im laufenden Baum nicht erreichbar. Es wird ein `nullptr` zurückgegeben, was zu einem Absturz im aufrufenden Code führen kann. Möglicherweise wurde dem Baum kein Speicher hinzugefügt oder der Speicher ist von der Stelle aus, an der er referenziert wird, nicht erreichbar.
Dokumentation der Mitgliedsfunktionen
Storage::Storage()
Erstellt einen Speicher für den angegebenen Typ „ StorageStruct “. Immer wenn die laufende Instanz „ QTaskTree “ in einen „ Group “ eintritt, in dem sich der Speicher befindet, wird die Instanz „ StorageStruct “ mithilfe des Standardkonstruktors erstellt.
Hinweis: Alle Kopien des Objekts „ this “ gelten als dieselbe „Storage“-Instanz.
[explicit] template <
typename FirstArg,
typename... Args,
std::enable_if_t<!std::is_same_v<q20::remove_cvref_t<FirstArg>, Storage<StorageStruct>>, bool> = true
>
Storage::Storage(const FirstArg &firstArg, const Args &... args)
Erstellt einen Speicher für den angegebenen Typ „ StorageStruct “. Die übergebenen Werte „ firstArg “ und „ args “ werden beim Erstellen des Speichers gespeichert und später vom laufenden „ QTaskTree “ verwendet, um den „ StorageStruct “ mit dem gespeicherten „ args “ zu erstellen.
Hinweis: Alle Kopien des Objekts „ this “ gelten als dieselbe „Storage“-Instanz.
StorageStruct *Storage::activeStorage() const
Gibt einen Zeiger auf das aktive „ StorageStruct “-Objekt zurück, das vom laufenden Aufgabenbaum erstellt wurde. Verwenden Sie diese Funktion ausschließlich innerhalb des Handler-Körpers eines beliebigen „ GroupItem “-Elements, das im Rezept platziert wurde; andernfalls kann es zu einem Absturz kommen. Stellen Sie sicher, dass „Storage“ in einem beliebigen übergeordneten Gruppenelement des Gruppenelements des Handlers platziert ist.
Hinweis: Der zurückgegebene Zeiger ist so lange gültig, wie die Gruppe, die diese Instanz erstellt hat, noch ausgeführt wird.
Siehe auch „ operator->()“ und „ operator*()“.
[noexcept] StorageStruct &Storage::operator*() const
Gibt eine Referenz auf das aktive „ StorageStruct “-Objekt zurück, das vom laufenden Aufgabenbaum erstellt wurde. Verwenden Sie diese Funktion ausschließlich innerhalb des Handler-Körpers eines beliebigen „ GroupItem “-Elements, das im Rezept platziert wurde; andernfalls ist mit einem Absturz zu rechnen. Stellen Sie sicher, dass „Storage“ in einer übergeordneten Gruppe des Gruppenelements des Handlers platziert ist.
Hinweis: Die zurückgegebene Referenz ist so lange gültig, wie die Gruppe, die diese Instanz erstellt hat, noch ausgeführt wird.
Siehe auch „ activeStorage()“ und „ operator->()“.
[noexcept] StorageStruct *Storage::operator->() const
Gibt einen Zeiger auf das aktive „ StorageStruct “-Objekt zurück, das vom laufenden Aufgabenbaum erstellt wurde. Verwenden Sie diese Funktion ausschließlich innerhalb des Handler-Körpers eines beliebigen „ GroupItem “-Elements, das im Rezept platziert wurde; andernfalls kann es zu einem Absturz kommen. Stellen Sie sicher, dass „Storage“ in einem beliebigen übergeordneten Gruppenelement des Gruppenelements des Handlers platziert ist.
Hinweis: Der zurückgegebene Zeiger ist so lange gültig, wie die Gruppe, die diese Instanz erstellt hat, noch läuft.
Siehe auch „ activeStorage()“ und „ operator*()“.
© 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.