QtTaskTree::Storage Class
template <typename StorageStruct> class QtTaskTree::StorageUn modèle de classe permettant l'échange de données personnalisées dans l'arborescence des tâches en cours d'exécution. En savoir plus...
| 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 de : | QtTaskTree::StorageBase |
| Statut : | Aperçu technologique |
Cette classe est en avant-première technologique et est susceptible d'être modifiée.
Remarque : 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 chargé de créer et de détruire dynamiquement des objets du type personnalisé « StorageStruct ». La création et la destruction sont gérées par l’arborescence des tâches en cours d’exécution. Si un objet Storage est placé à l’intérieur d’un élément « Group », l’arborescence des tâches en cours d’exécution crée l’objet « StorageStruct » au démarrage du groupe et avant l’appel du gestionnaire de configuration du groupe. Par la suite, chaque fois qu’un gestionnaire au sein de ce groupe est appelé, l’arborescence des tâches active l’instance précédemment créée de l’objet StorageStruct. Cela inclut tous les gestionnaires de configuration et de fin de tâche des tâches et des groupes au sein du groupe où l’objet Storage a été placé, y compris dans les groupes imbriqués. Lorsqu’une copie de l’objet `Storage` est transmise au gestionnaire via la capture lambda, ce dernier peut accéder à l’instance activée par l’arborescence de tâches en cours d’exécution via les méthodes ` 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. Une fois le groupe terminé, l’instance de l’objet ` StorageStruct ` créée précédemment est détruite après l’appel du gestionnaire `done` du 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, ...)
};Comme 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 composants 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 de Storage. Vous pouvez placer plusieurs objets Storage à l’intérieur d’un élément Group, à condition qu’ils ne contiennent pas de copies du même objet Storage. Sinon, une assertion est déclenchée lors de l’exécution, accompagnée d’un message d’erreur. Cependant, vous pouvez placer des copies d’un même objet `Storage` dans différents éléments ` Group ` d’une même recette. Dans ce cas, l’arborescence de tâches en cours d’exécution créera plusieurs instances des objets ` StorageStruct ` (une pour chaque copie) et un masquage de stockage aura lieu. Le masquage de stockage fonctionne de manière similaire au masquage de variables en 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 servir à transmettre les données initiales à l’arborescence de tâches en cours d’exécution, ainsi qu’à extraire les données finales de l’arborescence avant qu’elle ne s’achève. Pour ce faire, utilisez respectivement ` onStorageSetup()` ou ` onStorageDone()`.
Remarque : si vous utilisez un objet Storage inaccessible au sein du gestionnaire, parce que vous avez oublié de placer le stockage dans la recette, ou que vous l’avez placé mais pas dans le groupe ancêtre d’un gestionnaire, vous pouvez vous attendre à un plantage, précédé du message suivant : « Le stockage référencé n’est pas accessible dans l’arborescence d’exécution. » Une valeur nullptr sera renvoyée, ce qui pourrait entraîner un plantage du code appelant. Il est possible qu’aucun stockage n’ait été ajouté à l’arborescence, ou que le stockage ne soit pas accessible depuis l’endroit où il est référencé.
Documentation des fonctions membres
Storage::Storage()
Crée un objet « Storage » pour le type « StorageStruct » spécifié. Chaque fois que l’ QTaskTree, en cours d’exécution, entre dans une « Group » où se trouve cet objet « Storage », il crée l’objet « StorageStruct » à l’aide du constructeur par défaut.
Remarque : toutes les copies de l’objet ` this ` sont considérées comme une seule et même instance de `Storage`.
[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 espace de stockage pour le type ` StorageStruct ` indiqué. Les paramètres ` firstArg ` et ` args ` transmis sont enregistrés lors de la création de l'espace de stockage, puis utilisés ultérieurement par l'instance ` QTaskTree ` en cours d'exécution pour construire l'instance ` StorageStruct ` à l'aide de la valeur ` args` enregistrée.
Remarque : toutes les copies de l’objet this sont considérées comme appartenant à la même instance de Storage.
StorageStruct *Storage::activeStorage() const
Renvoie un pointeur vers l'objet « StorageStruct » actif, créé par l'arborescence des tâches en cours d'exécution. N'utilisez cette fonction qu'à l'intérieur du corps du gestionnaire de n'importe quel élément « GroupItem » placé dans la recette ; sinon, vous risquez de provoquer un plantage. Assurez-vous 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 ayant créé cette instance est toujours en cours d’exécution.
Voir également operator->() et operator*().
[noexcept] StorageStruct &Storage::operator*() const
Renvoie une référence à l'objet StorageStruct actif, créé par l'arborescence 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 risquez de provoquer un plantage. Assurez-vous que Storage soit placé dans n'importe quel groupe ancêtre de l'élément de groupe du gestionnaire.
Remarque : la référence renvoyée est valide tant que le groupe ayant créé cette instance est toujours en cours d’exécution.
Voir également activeStorage() et operator->().
[noexcept] StorageStruct *Storage::operator->() const
Renvoie un pointeur vers l'objet ` StorageStruct ` actif, créé par l'arborescence 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 risquez de provoquer un plantage. Assurez-vous que `Storage` soit placé dans un groupe ancêtre de l'élément de groupe du gestionnaire.
Remarque : le pointeur renvoyé reste valide tant que le groupe ayant créé cette instance est toujours en cours d’exécution.
Voir également 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.