存储类
template <typename StorageStruct> class Tasking::Storage一个用于运行中的任务树中自定义数据交换的类模板。 更多信息...
头文件 | #include <solutions/tasking/tasktree.h> |
继承 | Tasking::StorageBase |
注意: 此类中所有函数都是 可重入的。
公共函数
存储() | |
StorageStruct * | activeStorage() const |
StorageStruct & | operator*() const |
StorageStruct * | operator->() const |
详细说明
Storage 类模板负责动态创建和销毁自定义 StorageStruct
类型的对象。创建和销毁由运行任务树管理。如果将 Storage 对象放置在 Group 元素内,运行任务树将在调用组的设置处理程序之前开始组并创建 StorageStruct
对象。以后,每当调用组内的任何处理程序时,任务树都会激活之前创建的 StorageStruct
对象实例。这包括放置存储对象的组、所有任务及其组设置和完成处理程序,包括嵌套组。当通过 lambda 捕获将 Storage 对象的副本传递到处理程序时,处理程序可以通过 operator->()、operator*() 或 activeStorage() 方法访问运行任务树激活的实例。如果两个处理程序捕获相同的 Storage 对象,其中一个可以将其存储在自定义数据中,而另一个可以在之后读取它。当组完成时,在组完成处理程序调用之后销毁之前创建的 StorageStruct
对象实例。
任务之间数据交换的示例
const Storage<QString> storage; const auto onFirstDone = [storage](const Task &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](Task &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 TaskItem(..., onFirstDone), // The setup handler of the second task reads the QString from the storage TaskItem(onSecondSetup, ...) };
由于根组按顺序执行其任务,因此 onFirstDone
处理程序总是先于 onSecondSetup
处理程序调用。这意味着,从 onSecondSetup
处理程序体的 storage
中读取的 QString 数据已由 onFirstDone
处理程序设置。您在 顺序 执行模式下始终可以依赖它。
存储的内部结构在所有副本之间共享。这就是为什么处理器 lambda 捕获内部存储对象的副本仍然引用同一个存储实例。只要它们不包括相同存储对象的副本,就可以在一个 Group 元素内部放置多个存储对象。否则,会在运行时触发一个包含错误消息的断言。然而,可以在相同配方中不同 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 } };
存储对象还可以用于向执行的任务树传递初始数据,并在任务树完成之前从中读取最终数据。为此,请分别使用 onStorageSetup() 或 onStorageDone
注意:如果在处理器中使用不可达的存储对象,因为忘记将存储放置在配方中,或者放置了但是不在任何处理器祖先组中,可能会遇到崩溃,并在崩溃之前出现以下消息:引用的存储在运行树中不可达。将返回 nullptr,这可能导致调用代码崩溃。可能没有任何存储被添加到树中,或者存储不可达。
成员函数文档
Storage::Storage()
为给定的 StorageStruct
类型创建存储。
注意:this
对象的所有副本被视为同一个存储实例。
StorageStruct *Storage::activeStorage() const
返回指向由运行任务树创建的活动 StorageStruct
对象的指针。请仅在将 GroupItem 元素放在配方中的任何处理器体内的处理器体中使用此函数,否则可能会遇到崩溃。确保存储被放置在任何处理器组项祖先组中。
注意:返回的指针在创建此实例的组仍在运行期间有效。
另请参阅:operator->() 和 operator*()。
[noexcept]
StorageStruct &Storage::operator*() const
返回指向由运行任务树创建的活动 StorageStruct
对象的引用。请仅在将 GroupItem 元素放在配方中的任何处理器体内的处理器体中使用此函数,否则可能会遇到崩溃。确保存储被放置在任何处理器组项祖先组中。
注意:返回的引用在创建此实例的组仍在运行期间有效。
另请参阅:activeStorage() 和 operator->()。
[noexcept]
StorageStruct *Storage::operator->() const
返回指向由运行任务树创建的活动 StorageStruct
对象的指针。请仅在将 GroupItem 元素放在配方中的任何处理器体内的处理器体中使用此函数,否则可能会遇到崩溃。确保存储被放置在任何处理器组项祖先组中。
注意:返回的指针在创建此实例的组仍在运行期间有效。
另请参阅:activeStorage() 和 operator*()。
©2024(Qt公司有限公司)。本文档中包含的贡献属于其各自的版权所有者。提供的文档受自由软件基金会发布的GNU自由文档许可第1.3版的条款约束。Qt及其相关标志是芬兰及其全球其他国家的Qt公司注册商标。所有其他商标均为其各自所有者的财产。