Auf dieser Seite

QtTaskTree::Storage Class

template <typename StorageStruct> class QtTaskTree::Storage

Eine Klassenvorlage für den benutzerdefinierten Datenaustausch im laufenden Aufgabenbaum. Mehr...

Kopfzeile: #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: QtTaskTree::StorageBase

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Öffentliche Funktionen

Storage()
Storage(const FirstArg &firstArg, const Args &... args)
StorageStruct *activeStorage() const
StorageStruct &operator*() const
StorageStruct *operator->() const

Detaillierte Beschreibung

Die Vorlage der Klasse Storage ist für die dynamische Erstellung und Zerstörung von Objekten des benutzerdefinierten Typs StorageStruct verantwortlich. Die Erstellung und Zerstörung wird durch den laufenden Taskbaum verwaltet. Wenn ein Storage-Objekt innerhalb eines Group -Elements platziert wird, erstellt der laufende Aufgabenbaum das StorageStruct -Objekt, wenn die Gruppe gestartet wird und bevor der Setup-Handler der Gruppe aufgerufen wird. Später, wenn ein Handler innerhalb dieser Gruppe aufgerufen wird, aktiviert der Aufgabenbaum die zuvor erstellte Instanz des StorageStruct Objekts. Dies schließt alle Handler für das Einrichten und Erledigen von Aufgaben und Gruppen innerhalb der Gruppe ein, in der das Speicherobjekt platziert wurde, auch innerhalb der verschachtelten Gruppen. Wenn eine Kopie des Storage-Objekts über das Lambda-Capture an den Handler übergeben wird, kann der Handler über die Methoden Storage::operator->(), Storage::operator*() oder activeStorage() auf die Instanz zugreifen, die durch den laufenden Aufgabenbaum aktiviert wurde. Wenn zwei Handler dasselbe Storage-Objekt erfassen, kann einer von ihnen dort benutzerdefinierte Daten speichern, und der andere kann sie 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 Wurzelgruppe ihre Aufgaben sequentiell ausführt, wird der onFirstDone -Handler immer vor dem onSecondSetup -Handler aufgerufen. Das bedeutet, dass die Daten von QString, die vom storage innerhalb des Body des onSecondSetup Handlers gelesen wurden, bereits vom onFirstDone Handler gesetzt wurden. Sie können sich im sequential Ausführungsmodus immer darauf verlassen.

Die Interna von Storage werden von allen seinen Kopien gemeinsam genutzt. Deshalb beziehen sich die Kopien des Storage-Objekts innerhalb der Lambda-Captures der Handler immer noch auf dieselbe Storage-Instanz. Sie können mehrere Storage-Objekte in einem Group Element platzieren, vorausgesetzt, sie enthalten keine Kopien desselben Storage-Objekts. Andernfalls wird zur Laufzeit ein Assert ausgelöst, das eine Fehlermeldung enthält. Sie können jedoch Kopien desselben Speicherobjekts in verschiedenen Group Elementen desselben Rezepts platzieren. In diesem Fall erzeugt der laufende Aufgabenbaum mehrere Instanzen der StorageStruct Objekte (eine für jede Kopie) und es findet eine Speicherschattierung statt. Das Storage Shadowing funktioniert ähnlich wie das C++-Variablen-Shadowing innerhalb der verschachtelten 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 für die Übergabe der Anfangsdaten an den ausgeführten Task-Baum und für das Auslesen der endgültigen Daten aus dem Task-Baum vor dessen Beendigung verwendet werden. Verwenden Sie dazu onStorageSetup() bzw. onStorageDone().

Hinweis: Wenn Sie ein unerreichbares Speicherobjekt innerhalb des Handlers verwenden, weil Sie vergessen haben, den Speicher im Rezept zu platzieren, oder ihn zwar platziert haben, aber nicht in der Vorgängergruppe eines Handlers, müssen Sie mit einem Absturz rechnen, dem die 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. Es ist möglich, dass dem Baum kein Speicher hinzugefügt wurde oder dass der Speicher von der Stelle, an der er referenziert wird, nicht erreichbar ist.

Dokumentation der Mitgliedsfunktionen

Storage::Storage()

Erzeugt einen Speicher für den angegebenen StorageStruct Typ. Immer wenn das laufende QTaskTree ein Group betritt, in dem das Storage platziert ist, erstellt es das StorageStruct mit dem Standardkonstruktor.

Hinweis: Alle Kopien des this Objekts werden als dieselbe Storage-Instanz betrachtet.

[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)

Erzeugt einen Speicher für den angegebenen StorageStruct Typ. Die übergebenen firstArg und args werden bei der Erstellung eines Speichers gespeichert und später von dem laufenden QTaskTree verwendet, um den StorageStruct mit dem gespeicherten args zu erstellen.

Hinweis: Alle Kopien des this Objekts werden als die gleiche Speicherinstanz betrachtet.

StorageStruct *Storage::activeStorage() const

Gibt einen Zeiger auf das aktive StorageStruct Objekt zurück, das vom laufenden Aufgabenbaum erstellt wurde. Verwenden Sie diese Funktion nur innerhalb des Handler-Bodys eines beliebigen GroupItem -Elements, das im Rezept platziert ist, andernfalls kann es zu einem Absturz kommen. Vergewissern Sie sich, dass Storage in einer Gruppe platziert ist, die ein Vorfahre des Gruppen-Elements des Handlers ist.

Hinweis: Der zurückgegebene Zeiger ist so lange gültig, wie die Gruppe, die diese Instanz erstellt hat, noch aktiv ist.

Siehe auch operator->() und operator*().

[noexcept] StorageStruct &Storage::operator*() const

Gibt einen Verweis auf das aktive StorageStruct Objekt zurück, das vom laufenden Aufgabenbaum erstellt wurde. Verwenden Sie diese Funktion nur innerhalb des Handler-Bodys eines beliebigen GroupItem Elements, das im Rezept platziert ist, andernfalls kann es zu einem Absturz kommen. Vergewissern Sie sich, dass Storage in einer Gruppe platziert ist, die ein Vorfahre des Gruppen-Elements des Handlers ist.

Hinweis: Der zurückgegebene Verweis ist so lange gültig, wie die Gruppe, die diese Instanz erstellt hat, noch aktiv ist.

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 nur innerhalb des Handler-Bodys eines beliebigen GroupItem -Elements, das im Rezept platziert ist, andernfalls kann es zu einem Absturz kommen. Vergewissern Sie sich, dass Storage in einer Gruppe platziert ist, die ein Vorfahre des Gruppen-Elements des Handlers ist.

Hinweis: Der zurückgegebene Zeiger ist so lange gültig, wie die Gruppe, die diese Instanz erstellt hat, noch aktiv ist.

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.