QtTaskTree::Storage Class
template <typename StorageStruct> class QtTaskTree::StorageModèle de classe pour l'échange de données personnalisées dans l'arborescence des tâches en cours d'exécution. Plus d'informations...
| En-tête : | #include <qtasktree.h> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS TaskTree)target_link_libraries(mytarget PRIVATE Qt6::TaskTree) |
| qmake : | QT += tasktree |
| Depuis : | Qt 6.11 |
| Hérite : | QtTaskTree::StorageBase |
Note : Toutes les fonctions de cette classe sont réentrantes.
Fonctions publiques
| Storage() | |
| Storage(const FirstArg &firstArg, const Args &... args) | |
| StorageStruct * | activeStorage() const |
| StorageStruct & | operator*() const |
| StorageStruct * | operator->() const |
Description détaillée
Le modèle de classe Storage est responsable de la création et de la destruction dynamiques des objets du type personnalisé StorageStruct. La création et la destruction sont gérées par l'arbre des tâches en cours d'exécution. Si un objet Storage est placé à l'intérieur d'un élément Group, l'arbre des tâches en cours d'exécution crée l'objet StorageStruct lorsque le groupe est démarré et avant que le gestionnaire de configuration du groupe ne soit appelé. Par la suite, chaque fois qu'un gestionnaire de ce groupe est appelé, l'arbre des tâches active l'instance précédemment créée de l'objet StorageStruct. Cela inclut tous les gestionnaires de configuration et d'exécution des tâches et des groupes à l'intérieur du groupe où l'objet Stockage a été placé, ainsi qu'à l'intérieur des groupes imbriqués. Lorsqu'une copie de l'objet Storage est transmise au gestionnaire via la capture lambda, le gestionnaire peut accéder à l'instance activée par l'arbre des tâches en cours d'exécution via la méthode Storage::operator->(), Storage::operator*() ou activeStorage(). Si deux gestionnaires capturent le même objet Storage, l'un d'eux peut y stocker des données personnalisées et l'autre peut les lire par la suite. Lorsque le groupe est terminé, l'instance précédemment créée de l'objet StorageStruct est détruite après l'appel du gestionnaire de fin de groupe.
Exemple d'échange de données entre tâches :
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, ...) };
Étant donné que le groupe racine exécute ses tâches de manière séquentielle, le gestionnaire onFirstDone est toujours appelé avant le gestionnaire onSecondSetup. Cela signifie que les données de QString, lues à partir de storage dans le corps du gestionnaire onSecondSetup, ont déjà été définies par le gestionnaire onFirstDone. Vous pouvez toujours vous y fier en mode d'exécution sequential.
Les éléments internes de Storage sont partagés entre toutes ses copies. C'est pourquoi les copies de l'objet Storage à l'intérieur des captures lambda des gestionnaires font toujours référence à la même instance Storage. Vous pouvez placer plusieurs objets Storage à l'intérieur d'un élément Group, à condition qu'ils n'incluent pas de copies du même objet Storage. Dans le cas contraire, un assert est déclenché au moment de l'exécution, avec un message d'erreur. Cependant, vous pouvez placer des copies du même objet Storage dans différents éléments Group de la même recette. Dans ce cas, l'arbre des tâches en cours d'exécution créera plusieurs instances des objets StorageStruct (une pour chaque copie) et l'observation du stockage aura lieu. L'ombrage de stockage fonctionne de la même manière que l'ombrage de variables C++ à l'intérieur des blocs de code imbriqués :
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 } };
Les objets Storage peuvent également être utilisés pour transmettre les données initiales à l'arbre des tâches exécuté et pour lire les données finales de l'arbre des tâches avant qu'il ne se termine. Pour ce faire, utilisez onStorageSetup() ou onStorageDone(), respectivement.
Remarque : si vous utilisez un objet Storage inaccessible à l'intérieur du gestionnaire, parce que vous avez oublié de placer le stockage dans la recette, ou que vous l'avez placé, mais pas dans un groupe d'ancêtres du gestionnaire, vous pouvez vous attendre à un plantage, précédé du message suivant : Le stockage référencé n'est pas accessible dans l'arbre en cours d'exécution. Un nullptr sera renvoyé, ce qui peut entraîner un plantage du code appelant. Il est possible qu'aucun stockage n'ait été ajouté à l'arbre, ou que le stockage ne soit pas accessible à partir de l'endroit où il est référencé.
Documentation des fonctions membres
Storage::Storage()
Crée un stockage pour le type StorageStruct donné. Lorsque le site QTaskTree en cours d'exécution entre dans un site Group où le stockage est placé, il crée le site StorageStruct à l'aide du constructeur par défaut.
Remarque : toutes les copies de l'objet this sont considérées comme la même instance de stockage.
[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)
Crée un stockage pour le type StorageStruct donné. Les objets firstArg et args transmis sont stockés lors de la création d'un stockage et sont utilisés ultérieurement par l'exécution de QTaskTree pour construire StorageStruct à l'aide de l'objet args stocké.
Remarque : toutes les copies de l'objet this sont considérées comme la même instance de stockage.
StorageStruct *Storage::activeStorage() const
Renvoie un pointeur sur l'objet StorageStruct actif, créé par l'arbre des tâches en cours d'exécution. N'utilisez cette fonction qu'à l'intérieur du corps du gestionnaire de tout élément GroupItem placé dans la recette, sinon vous pouvez vous attendre à un plantage. Veillez à ce que Storage soit placé dans un groupe ancêtre de l'élément de groupe du gestionnaire.
Remarque : le pointeur renvoyé est valide tant que le groupe qui a créé cette instance est toujours en cours d'exécution.
Voir aussi operator->() et operator*().
[noexcept] StorageStruct &Storage::operator*() const
Renvoie une référence à l'objet StorageStruct actif, créé par l'arbre des tâches en cours d'exécution. N'utilisez cette fonction qu'à l'intérieur du corps du gestionnaire de tout élément GroupItem placé dans la recette, sinon vous pouvez vous attendre à un plantage. Veillez à ce que Storage soit placé dans tout groupe ancêtre de l'élément de groupe du gestionnaire.
Remarque : la référence renvoyée est valide tant que le groupe qui a créé cette instance est toujours en cours d'exécution.
Voir aussi activeStorage() et operator->().
[noexcept] StorageStruct *Storage::operator->() const
Renvoie un pointeur sur l'objet StorageStruct actif, créé par l'arbre des tâches en cours d'exécution. N'utilisez cette fonction qu'à l'intérieur du corps du gestionnaire de tout élément GroupItem placé dans la recette, sinon vous pouvez vous attendre à un plantage. Veillez à ce que Storage soit placé dans un groupe ancêtre de l'élément de groupe du gestionnaire.
Remarque : le pointeur renvoyé est valide tant que le groupe qui a créé cette instance est toujours en cours d'exécution.
Voir aussi activeStorage() et 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.