Group Class

class Tasking::Group

Group represents the basic element for composing declarative recipes describing how to execute and handle a nested tree of asynchronous tasks. More...

Header: #include <solutions/tasking/tasktree.h>
Inherits: Tasking::ExecutableItem

Note: All functions in this class are reentrant.

Public Functions

Group(const Tasking::GroupItems &children)
Group(std::initializer_list<Tasking::GroupItem> children)

Detailed Description

Group is a container for other group items. It encloses child tasks into one unit, which is seen by the group's parent as a single, asynchronous task. Since Group is of the GroupItem type, it may also be a child of Group.

Insert child tasks into the group by using aliased custom task names, such as, ConcurrentCallTask<ResultType> or NetworkQueryTask:

const Group group {
    NetworkQueryTask(...),
    ConcurrentCallTask<int>(...)
};

The group's behavior may be customized by inserting the items returned by parallelLimit() or workflowPolicy() functions:

const Group group {
    parallel,
    continueOnError,
    NetworkQueryTask(...),
    NetworkQueryTask(...)
};

The group may contain nested groups:

const Group group {
    finishAllAndSuccess,
    NetworkQueryTask(...),
    Group {
        NetworkQueryTask(...),
        Group {
            parallel,
            NetworkQueryTask(...),
            NetworkQueryTask(...),
        }
        ConcurrentCallTask<QString>(...)
    }
};

The group may dynamically instantiate a custom storage structure, which may be used for inter-task data exchange:

struct MyCustomStruct { QByteArray data; };

Storage<MyCustomStruct> storage;

const auto onFirstSetup = [](NetworkQuery &task) { ... };
const auto onFirstDone = [storage](const NetworkQuery &task) {
    // storage-> gives a pointer to MyCustomStruct instance,
    // created dynamically by the running task tree.
    storage->data = task.reply()->readAll();
};
const auto onSecondSetup = [storage](ConcurrentCall<QImage> &task) {
    // storage-> gives a pointer to MyCustomStruct. Since the group is sequential,
    // the stored MyCustomStruct was already updated inside the onFirstDone handler.
    const QByteArray storedData = storage->data;
};

const Group group {
    // When the group is entered by a running task tree, it creates MyCustomStruct
    // instance dynamically. It is later accessible from all handlers via
    // the *storage or storage-> operators.
    sequential,
    storage,
    NetworkQueryTask(onFirstSetup, onFirstDone, CallDoneIf::Success),
    ConcurrentCallTask<QImage>(onSecondSetup)
};

Member Function Documentation

Group::Group(const Tasking::GroupItems &children)

Constructs a group with a given list of children.

This constructor is useful when the child items of the group are not known at compile time, but later, at runtime:

const QStringList sourceList = ...;

GroupItems groupItems { parallel };

for (const QString &source : sourceList) {
    const NetworkQueryTask task(...); // use source for setup handler
    groupItems << task;
}

const Group group(groupItems);

Group::Group(std::initializer_list<Tasking::GroupItem> children)

Constructs a group from std::initializer_list given by children.

This constructor is useful when all child items of the group are known at compile time:

const Group group {
    finishAllAndSuccess,
    NetworkQueryTask(...),
    Group {
        NetworkQueryTask(...),
        Group {
            parallel,
            NetworkQueryTask(...),
            NetworkQueryTask(...),
        }
        ConcurrentCallTask<QString>(...)
    }
};

Copyright © The Qt Company Ltd. and other contributors. 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.