このページでは

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オブジェクトが配置されたグループ内(ネストされたグループ内も含む)の、すべてのタスクおよびグループのセットアップハンドラとdoneハンドラが含まれます。 Storageオブジェクトのコピーがラムダキャプチャを介してハンドラに渡されると、ハンドラはStorage::operator->()、Storage::operator*()、またはactiveStorage()メソッドを介して、実行中のタスクツリーによってアクティブ化されたインスタンスにアクセスできます。2つのハンドラが同じ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の内部構造は、そのすべてのコピー間で共有されます。そのため、ハンドラのラムダキャプチャ内にあるStorageオブジェクトのコピーは、依然として同じStorageインスタンスを参照しています。Group 要素内に複数のStorageオブジェクトを配置することは可能ですが、それらが同じStorageオブジェクトのコピーを含まないことが条件となります。そうでない場合、実行時にエラーメッセージを含むアサートがトリガーされます。 ただし、同じレシピ内の異なるGroup 要素に、同一のStorageオブジェクトのコピーを配置することは可能です。この場合、実行中のタスクツリーはStorageStruct オブジェクトの複数のインスタンス(コピーごとに1つずつ)を作成し、ストレージのシャドウイングが行われます。ストレージのシャドウイングは、ネストされたコードブロック内での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 が、そのStorageが配置されている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.