QtTaskTree::Storage Class
template <typename StorageStruct> class QtTaskTree::Storage一个用于在正在运行的任务树中进行自定义数据交换的类模板。更多内容...
| 头文件: | #include <qtasktree.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS TaskTree) target_link_libraries(mytarget PRIVATE Qt6::TaskTree) |
| qmake: | QT += tasktree |
| 自: | Qt 6.11 |
| 继承自: | QtTaskTree::StorageBase |
| 状态: | 技术预览 |
该类处于技术预览阶段,内容可能会有变动。
注意:本类中的所有函数均为可重入函数。
公共函数
| Storage() | |
| Storage(const FirstArg &firstArg, const Args &... args) | |
| StorageStruct * | activeStorage() const |
| StorageStruct & | operator*() const |
| StorageStruct * | operator->() const |
详细说明
Storage 类模板负责动态创建和销毁自定义StorageStruct 类型的对象。创建和销毁由运行中的任务树管理。如果将 Storage 对象放置在Group 元素中,则当组启动时,在调用组的设置处理程序之前,运行中的任务树会创建StorageStruct 对象。 此后,每当该组内的任何处理程序被调用时,任务树都会激活先前创建的StorageStruct 对象实例。这包括放置了Storage对象的组内所有任务和组的初始化及完成处理程序,也包括嵌套组中的相关处理程序。 当Storage对象的副本通过lambda捕获传递给处理程序时,该处理程序可通过Storage::operator->()、Storage::operator*()或activeStorage()方法访问由正在运行的任务树激活的实例。如果两个处理程序捕获了同一个Storage对象,其中一个可以在其中存储自定义数据,另一个随后可以读取该数据。 当组处理完毕时,在调用该组的 done 处理程序之后,先前创建的StorageStruct 对象实例将被销毁。
任务间数据交换的示例:
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, ...)
};由于根组按顺序执行其任务,因此“onFirstDone ”处理程序总是在“onSecondSetup ”处理程序之前被调用。这意味着在“onSecondSetup ”处理程序主体中从storage 读取的QString 数据,此前已被“onFirstDone ”处理程序设置完毕。在sequential 执行模式下,您可以始终依赖这一点。
Storage 的内部数据在其所有副本之间是共享的。这就是为什么处理程序 lambda 捕获范围内的 Storage 对象副本仍然引用同一个 Storage 实例。您可以在一个Group 元素中放置多个 Storage 对象,前提是它们不包含同一个 Storage 对象的副本。否则,运行时将触发包含错误消息的断言。 不过,您可以在同一配方中将同一个Storage对象的副本放置在不同的Group 元素内。在这种情况下,运行中的任务树将创建多个StorageStruct 对象的实例(每个副本一个),并会发生存储遮蔽。存储遮蔽的工作原理类似于C++中嵌套代码块内的变量遮蔽:
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
}
};Storage对象还可用于将初始数据传递给正在执行的任务树,以及在任务树完成之前从中读取最终数据。为此,请分别使用onStorageSetup()或onStorageDone()。
注意:若 在处理程序中使用了不可达的 Storage 对象(例如因忘记在配方中放置该存储,或虽已放置但未将其置于任何处理程序的祖先组中),可能会发生崩溃,且崩溃前会显示以下消息:所引用的存储在运行树中不可达。 此时将返回 nullptr,这可能会导致调用代码崩溃。这可能是因为树中未添加任何存储,或者从引用位置无法访问该存储。
成员函数文档
Storage::Storage()
为给定的StorageStruct 类型创建一个存储对象。每当运行中的QTaskTree 进入包含该存储对象的Group 时,它就会使用默认构造函数创建StorageStruct 。
注意:所有 this 对象的副本都被视为同一个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)
为给定的StorageStruct 类型创建一个存储。创建存储时会存储传入的firstArg 和args ,随后运行中的QTaskTree 会使用这些参数,结合存储的args 来构建StorageStruct 。
注意:所有 this 对象的副本均被视为同一个 Storage 实例。
StorageStruct *Storage::activeStorage() const
返回由正在运行的任务树创建的、处于活动状态的StorageStruct 对象的指针。请仅在配方中放置的任何GroupItem 元素的处理程序主体内使用此函数,否则可能会导致程序崩溃。请确保将Storage放置在处理程序所属组项的任何祖先组中。
注意: 只要创建此实例的组仍在运行,返回的指针就有效。
另请参阅 operator->() 和operator*()。
[noexcept] StorageStruct &Storage::operator*() const
返回对当前活动StorageStruct 对象的引用,该对象由正在运行的任务树创建。请仅在配方中放置的任何GroupItem 元素的处理程序主体内使用此函数,否则可能会导致程序崩溃。请确保将Storage放置在处理程序所属组项的任何祖先组中。
注意: 只要创建此实例的组仍在运行,返回的引用就一直有效。
另请参阅 activeStorage() 和operator->()。
[noexcept] StorageStruct *Storage::operator->() const
返回指向由正在运行的任务树创建的、处于活动状态的StorageStruct 对象的指针。仅可在配方中放置的任何GroupItem 元素的处理程序主体内使用此函数,否则可能会导致程序崩溃。请确保将Storage放置在处理程序所属组项的任何祖先组中。
注意: 只要创建此实例的组仍在运行,返回的指针就有效。
另请参阅 activeStorage() 和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.