存储类

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

成员函数文档

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公司注册商标。所有其他商标均为其各自所有者的财产。