QtTaskTree::Storage Class
template <typename StorageStruct> class QtTaskTree::StorageUna plantilla de clase para el intercambio de datos personalizados en el árbol de tareas en ejecución. Más...
| Cabecera: | #include <qtasktree.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS TaskTree)target_link_libraries(mytarget PRIVATE Qt6::TaskTree) |
| qmake: | QT += tasktree |
| Desde: | Qt 6.11 |
| Hereda de: | QtTaskTree::StorageBase |
Nota: Todas las funciones de esta clase son reentrantes.
Funciones Públicas
| Storage() | |
| Storage(const FirstArg &firstArg, const Args &... args) | |
| StorageStruct * | activeStorage() const |
| StorageStruct & | operator*() const |
| StorageStruct * | operator->() const |
Descripción Detallada
La plantilla de la clase Storage es responsable de crear y destruir dinámicamente objetos del tipo personalizado StorageStruct. La creación y destrucción son gestionadas por el árbol de tareas en ejecución. Si se coloca un objeto Storage dentro de un elemento Group, el árbol de tareas en ejecución crea el objeto StorageStruct cuando se inicia el grupo y antes de que se llame al manejador de configuración del grupo. Posteriormente, cada vez que se llama a cualquier manejador dentro de este grupo, el árbol de tareas activa la instancia previamente creada del objeto StorageStruct. Esto incluye todos los manejadores de tareas y grupos dentro del grupo donde el objeto Storage fue colocado, también dentro de los grupos anidados. Cuando se pasa una copia del objeto Storage al manejador a través de la captura lambda, el manejador puede acceder a la instancia activada por el árbol de tareas en ejecución a través del método Storage::operator->(), Storage::operator*(), o activeStorage(). Si dos manejadores capturan el mismo objeto Storage, uno de ellos puede almacenar allí un dato personalizado, y el otro puede leerlo después. Cuando el grupo finaliza, la instancia creada anteriormente del objeto StorageStruct se destruye después de llamar al manejador de finalización del grupo.
Ejemplo de intercambio de datos entre tareas:
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, ...) };
Dado que el grupo raíz ejecuta sus tareas secuencialmente, el gestor onFirstDone siempre se llama antes que el gestor onSecondSetup. Esto significa que los datos de QString, leídos desde storage dentro del cuerpo del manejador onSecondSetup, ya han sido fijados por el manejador onFirstDone. Siempre se puede contar con ello en el modo de ejecución sequential.
Los internos de Storage son compartidos entre todas sus copias. Es por eso que las copias del objeto Storage dentro de las capturas lambda de los manejadores siguen refiriéndose a la misma instancia de Storage. Puede colocar varios objetos Storage dentro de un elemento Group, siempre que no incluyan copias del mismo objeto Storage. En caso contrario, se lanzará una aserción en tiempo de ejecución que incluirá un mensaje de error. Sin embargo, puede colocar copias del mismo objeto Storage en diferentes elementos Group de la misma receta. En este caso, el árbol de tareas en ejecución creará múltiples instancias de los objetos StorageStruct (una para cada copia) y se producirá el sombreado de almacenamiento. La sombra de almacenamiento funciona de forma similar a la sombra de variables C++ dentro de los bloques de código anidados:
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 } };
Los objetos Storage también pueden utilizarse para pasar los datos iniciales al árbol de tareas ejecutado, y para leer los datos finales del árbol de tareas antes de que finalice. Para ello, utilice onStorageSetup() o onStorageDone(), respectivamente.
Nota: Si utilizas un objeto Storage inalcanzable dentro del manejador, porque olvidaste colocar el almacenamiento en la receta, o lo colocaste, pero no en ningún grupo ancestro del manejador, puedes esperar un crash, precedido por el siguiente mensaje: El almacenamiento referenciado no es accesible en el árbol en ejecución. Se devolverá un nullptr que podría provocar un fallo en el código de llamada. Es posible que no se haya añadido ningún almacenamiento al árbol, o que el almacenamiento no sea accesible desde el lugar al que se hace referencia.
Documentación de las funciones miembro
Storage::Storage()
Crea un almacenamiento para el tipo StorageStruct dado. Cada vez que el QTaskTree en ejecución entra en un Group donde se coloca el Almacenamiento, crea el StorageStruct utilizando el constructor por defecto.
Nota: Todas las copias del objeto this se consideran la misma instancia de Almacenamiento.
[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)
Crea un almacenamiento para el tipo StorageStruct dado. Los datos pasados firstArg y args se almacenan al crear un almacenamiento, y son utilizados posteriormente por el QTaskTree en ejecución para construir el StorageStruct con el args almacenado.
Nota: Todas las copias del objeto this se consideran la misma instancia de almacenamiento.
StorageStruct *Storage::activeStorage() const
Devuelve un puntero al objeto StorageStruct activo, creado por el árbol de tareas en ejecución. Utilice esta función sólo desde dentro del cuerpo del manejador de cualquier elemento GroupItem colocado en la receta, de lo contrario puede esperar un fallo. Asegúrese de que Storage se coloca en cualquier grupo antepasado del elemento de grupo del manejador.
Nota: El puntero devuelto es válido mientras el grupo que creó esta instancia siga funcionando.
Véase también operator->() y operator*().
[noexcept] StorageStruct &Storage::operator*() const
Devuelve una referencia al objeto StorageStruct activo, creado por el árbol de tareas en ejecución. Utilice esta función sólo desde dentro del cuerpo del manejador de cualquier elemento GroupItem colocado en la receta, de lo contrario puede esperar un fallo. Asegúrese de que Storage se coloca en cualquier ancestro de grupo del elemento de grupo del manejador.
Nota: La referencia devuelta es válida mientras el grupo que creó esta instancia siga funcionando.
Véase también activeStorage() y operator->().
[noexcept] StorageStruct *Storage::operator->() const
Devuelve un puntero al objeto StorageStruct activo, creado por el árbol de tareas en ejecución. Utilice esta función sólo desde dentro del cuerpo del manejador de cualquier elemento GroupItem colocado en la receta, de lo contrario puede esperar un fallo. Asegúrese de que Storage se coloca en cualquier grupo antepasado del elemento de grupo del manejador.
Nota: El puntero devuelto es válido mientras el grupo que creó esta instancia siga funcionando.
Véase también activeStorage() y 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.