CustomTask 类

template <typename Adapter> class Tasking::CustomTask

一个用于声明自定义任务项及其设置和完成处理器的类模板。点击更多...

头文件 #include <solutions/tasking/tasktree.h>
继承 Tasking::ExecutableItem

注意: 此类中所有函数都是 可重入的

公共类型

公共函数

CustomTask(SetupHandler &&setup = TaskSetupHandler(), DoneHandler &&done = TaskDoneHandler(), Tasking::CallDoneIf callDoneIf = CallDoneIf::SuccessOrError)

详细描述

描述任务树食谱中的自定义任务项。

使用给定 TaskAdapter 子类作为模板参数的 CustomTask 模板,将自定义任务名称别名化为唯一的名称。例如,ConcurrentCallTask<T> 是一个别名,指向定义为与 ConcurrentCall<T> 一起工作的 CustomTask。以下表格包含示例自定义任务及其关联的任务类

别名任务名称(任务空间)关联的任务类简要描述
ConcurrentCallTask<ReturnType>ConcurrentCall<ReturnType>启动一个异步任务。在单独的线程中运行。
NetworkQueryTaskNetworkQuery发送网络查询。
TaskTreeTaskTaskTree启动一个嵌套的任务树。
TimeoutTaskstd::chrono::milliseconds启动计时器。
WaitForBarrierTaskMultiBarrier<Limit>启动一个等待屏障通过的异步任务。

成员类型文档

[别名] CustomTask::Deleter

任务与其关联的自定义任务 Adapter 的类型删除器的类型别名。

[别名] CustomTask::Task

任务与其关联的自定义任务 Adapter 的任务类型的类型别名。

[别名] CustomTask::TaskDoneHandler

libstdc++ 中定义的类型别名,即 std::function<DoneResult(const Task &, DoneWith)>DoneResult

设计为自定义任务元素构造函数的可选参数的 TaskDoneHandler。任何符合上述签名的函数,当作为任务完成处理器传递时,将由运行的任务树在任务执行完成后,在最终执行结果报告给父组之前调用。

在处理器的主体中,您可以检索已完成的任务中的最终数据。包括存储在内的额外参数可以通过lambda捕获传递给处理器。您还可以动态决定任务是否应该使用其返回值完成,或者最终结果是否应该进行调整。

DoneWith 参数是可选的,您的完成处理器可以省略它。当提供时,它包含将报告给父级的任务最终结果的信息。

如果您不打算从已完成的任务中读取任何数据,您可以省略 const Task & 参数。

返回的 DoneResult 值是可选的,您的处理器可以返回 void 而不是。在这种情况下,任务的最终结果将与 DoneWith 参数指示的值相等。当处理器返回 DoneResult 值时,任务最终结果可以在完成处理器主体内通过返回的值进行调整。

对于 DoneResult 类型的 TaskDoneHandler,不会执行任何额外的处理,任务将无条件地使用传递的 DoneResult 参数值结束。

另请参阅 CustomTask(),TaskSetupHandlerGroupDoneHandler

[别名] CustomTask::TaskSetupHandler

std::function<SetupResult(Task &)> 的类型别名。

TaskSetupHandler 是自定义任务元素的构造函数的可选参数。任何与上述签名匹配的函数,当作为任务设置处理器传递时,将在任务创建后并且在开始之前由运行中的任务树调用。

在处理器主体内部,您可以根据您的需求配置任务。包括存储在内的额外参数可以通过lambda捕获传递给处理器。您可以动态决定任务是否应该启动或跳过,以成功或错误结束。

注意:不要在启动处理器中自行启动任务。将其留给 TaskTree,否则行为是未定义的。

处理器的返回值指示在处理器调用完成后运行的任务树如何继续。返回值 SetupResult::Continue 指示任务树继续运行,即执行相关的 Task。返回值 SetupResult::StopWithSuccessSetupResult::StopWithError 指示任务树跳过任务执行,并立即分别以成功或错误结束。

当返回类型为 SetupResult::StopWithSuccessSetupResult::StopWithError 时,不调用任务的完成处理器(如果提供了的话)。

自定义任务的构造函数还接受 std::function<void(Task &)> 的简写形式,即返回值是 void。在这种情况下,假设返回值是 SetupResult::Continue

另请参阅 CustomTask(),TaskDoneHandlerGroupSetupHandler

成员函数文档

模板 <typename SetupHandler = Tasking::CustomTask<Adapter>::TaskSetupHandler, typename DoneHandler = Tasking::CustomTask::TaskDoneHandler> CustomTask::CustomTask(SetupHandler &&setup = TaskSetupHandler(), DoneHandler &&done = TaskDoneHandler(), Tasking::CallDoneIf callDoneIf = CallDoneIf::SuccessOrError)

构建一个 CustomTask 实例,并将 setupdone 处理器附加到任务。当正在运行的任务树即将启动任务时,它实例化相关的Task对象,使用创建的任务的引用调用setup处理器,并启动它。当运行的任务完成时,任务树调用一个带有创建的任务常量引用done处理器。

传递的setup处理器类型为TaskSetupHandler。例如

static void parseAndLog(const QString &input);

...

const QString input = ...;

const auto onFirstSetup = [input](ConcurrentCall<void> &task) {
    if (input == "Skip")
        return SetupResult::StopWithSuccess; // This task won't start, the next one will
    if (input == "Error")
        return SetupResult::StopWithError; // This task and the next one won't start
    task.setConcurrentCallData(parseAndLog, input);
    // This task will start, and the next one will start after this one finished with success
    return SetupResult::Continue;
};

const auto onSecondSetup = [input](ConcurrentCall<void> &task) {
    task.setConcurrentCallData(parseAndLog, input);
};

const Group group {
    ConcurrentCallTask<void>(onFirstSetup),
    ConcurrentCallTask<void>(onSecondSetup)
};

done处理器类型为TaskDoneHandler。默认情况下,当任务完成时将调用done处理器。当您想要处理器只在执行成功或失败时调用时,请传递默认值以外的值给callDoneIf参数。

另请参阅 TaskSetupHandlerTaskDoneHandler

©2024 Qt公司版权所有。文档贡献属于各自的拥有者。本提供的文档根据Free Software Foundation发布、GNU自由文档许可版本1.3的条款进行许可。