このページでは

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オブジェクトが配置されたグループ内のすべてのタスクとグループのセットアップと完了のハンドラ、ネストされたグループ内も含まれます。Storageオブジェクトのコピーがラムダキャプチャを介してハンドラに渡されると、ハンドラは、Storage::operator->()、Storage::operator*()、activeStorage()メソッドを介して、実行中のタスクツリーによってアクティブ化されたインスタンスにアクセスすることができます。つのハンドラが同じStorageオブジェクトをキャプチャした場合、そのうちの1つはカスタムデータをそこに格納し、もう1つは後からそれを読み込むことができる。グループが終了すると、グループの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インスタンスを参照します。1つの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
    }
};

ストレージ・オブジェクトは、実行されるタスク・ツリーに初期データを渡したり、タスク・ツリーが終了する前にタスク・ツリーから最終データを読み出したりするためにも使用できます。これを行うには、それぞれonStorageSetup() またはonStorageDone() を使用する。

注意: レシピにストレージを置き忘れたり、どのハンドラの祖先グループにも置かなかったりして、ハンドラ内部で到達不可能なストレージオブジェクトを使用した場合、以下のようなメッセージが表示され、クラッシュする可能性があります:参照されたストレージは実行中のツリーでは到達できません。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 タイプのストレージを作成する。渡されたfirstArgargs は、ストレージを作成するときに格納され、後で実行中のQTaskTree が、格納されたargsStorageStruct を構築するときに使用される。

注: this オブジェクトのすべてのコピーは、同じストレージインスタンスとみなされます。

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.