このページでは

QtTaskTree::QCustomTask Class

template <typename Task, typename Adapter, typename Deleter> class QtTaskTree::QCustomTask

カスタムタスク項目を宣言し、そのセットアップおよび完了ハンドラを定義するために使用されるクラステンプレート。詳細...

ヘッダー: #include <qtasktree.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS TaskTree)
target_link_libraries(mytarget PRIVATE Qt6::TaskTree)
qmake: QT += tasktree
以下のように: Qt 6.11
継承元: QtTaskTree::ExecutableItem
ステータス: テクノロジープレビュー

このクラスはテクノロジープレビュー段階にあり、変更される可能性があります。

注:このクラスのすべての関数は再入可能です。

パブリック型

パブリック関数

QCustomTask(SetupHandler &&setup = QCustomTask::TaskSetupHandler(), DoneHandler &&done = QCustomTask::TaskDoneHandler(), QtTaskTree::CallDone callDone = QtTaskTree::CallDoneFlag::Always)

詳細な説明

タスクツリーのレシピ内のカスタムタスク項目について説明します。

カスタムタスク名は、指定されたTask 、Adapter 、およびDeleter を使用して、QCustomTaskテンプレートを通じて一意の名前でエイリアス化されます。例えば、QThreadFunctionTask<T>は、QThreadFunction<T>を関連タスククラスとして機能するように定義されたQCustomTaskへのエイリアスです。以下の表には、TaskTreeライブラリが提供するカスタムタスクと、それに関連するタスククラスが記載されています:

エイリアス付きタスク名関連タスククラス概要
QBarrierTaskQBarrierアウェイタータスクを開始します。
QThreadFunctionTask<ReturnType>QThreadFunction<戻り値型>非同期タスクを開始します。別のスレッドで実行されます。
QProcessTaskQProcessプロセスを開始します。
QNetworkReplyWrapperTaskQNetworkReplyWrapperネットワーククエリを送信します。
QTaskTreeTaskQTaskTreeネストされたタスクツリーを開始します。
QTcpSocketWrapperTaskQTcpSocketWrapperTCP 接続を確立します。
QTimeoutTaskstd::chrono::millisecondsタイマーを開始します。

Task テンプレートパラメータは必須であり、レシピの一部である場合に、実行中のQTaskTree がインスタンス化するTask の型を指定します。Task 型は、デフォルトでコンストラクタが定義されている必要があります。

Adapter テンプレート引数はオプションです。QDefaultTaskAdapter<Task>がTask 型に適応可能であれば、この引数を省略できます。そうでない場合、特定のTask に対するAdapter は、以下の形式である必要があります:

class Adapter
{
public:
    void operator()(Task *task, QTaskInterface *iface) { ... }
};

task を開始するには上記のoperator()を実装し、タスクが完了した際には、渡されたiface に対してQTaskInterface::reportDone()メソッドを呼び出してください。

渡されたTask およびQTaskInterface は、Adapter よりも長く存続することが保証されています。必要に応じて、Adapter のデストラクタから、渡されたTask にアクセスすることも可能です。

詳細については、QTaskInterface を参照してください。

Deleter テンプレート引数はオプションです。デフォルトでは、std::default_delete<Task> が使用されます。カスタムDeleter は、実行中のTask のデストラクタが呼び出し元スレッドをブロックする可能性がある場合に役立ちます。ブロックする代わりに、カスタムデリータは実行中のタスクを別のスレッドに移動し、そこでブロックする破棄を実装することができます。 このようにして、(呼び出し元スレッドから見て)ブロックするデストラクタを持つ実行中のタスクの高速な破棄を実現できます。

QTaskInterfaceも参照してください 。

メンバ型のドキュメント

[alias] QCustomTask::TaskDoneHandler

std::function<QtTaskTree::DoneResult(const Task &, QtTaskTree::DoneWith)> またはDoneResult の型エイリアス。

TaskDoneHandler は、カスタムタスク要素のコンストラクタのオプション引数です。上記のシグネチャを持つ関数は、タスク完了ハンドラとして渡されると、タスクの実行が終了した後、実行の最終結果が親グループに報告される前に、実行中のタスクツリーによって呼び出されます。

ハンドラの本体内では、完了したタスクから最終データを取得できます。ストレージを含む追加パラメータは、ラムダキャプチャを介してハンドラに渡すことができます。また、タスクをその戻り値で終了させるか、最終結果を調整するかを動的に決定することも可能です。

DoneWith 引数はオプションであり、doneハンドラで省略することも可能です。指定された場合、この引数には親に報告されるタスクの最終結果に関する情報が格納されます。

完了したタスクからデータを読み取る予定がない場合は、const Task & 引数を省略できます。

返される `DoneResult ` の値はオプションであり、ハンドラは代わりに `void ` を返すこともできます。この場合、タスクの最終結果は `DoneResult ` 引数で指定された値と同じになります。ハンドラが `DoneResult ` の値を返す場合、タスクの最終結果は、doneハンドラの本体内で返された値によって調整される可能性があります。

DoneResult 型のTaskDoneHandlerの場合、追加の処理は実行されず、DoneResult で渡された値をもってタスクは条件付きなく終了します。

QCustomTask()、TaskSetupHandler 、およびGroupDoneHandlerも参照してください 。

[alias] QCustomTask::TaskSetupHandler

std::function<SetupResult(Task &)> の型エイリアス。

`TaskSetupHandler` は、カスタムタスク要素のコンストラクタのオプション引数です。上記のシグネチャを持つ関数は、タスクセットアップハンドラとして渡されると、タスクが作成された後、実行が開始される前に、実行中のタスクツリーによって呼び出されます。

ハンドラの本体内で、必要に応じてタスクを設定できます。ストレージを含む追加のパラメータは、ラムダキャプチャを介してハンドラに渡すことができます。タスクを開始するか、成功またはエラーとしてスキップするかを動的に決定できます。

注: startハンドラ内でタスクを独自に開始しないでください 。QTaskTree に任せてください。そうしないと、挙動が不定になります。QCustomTask<Task, Adapter, Deleter>コンストラクタに渡されたAdapterテンプレートパラメータのおかげで、QTaskTree はタスクの開始方法をすでに把握しています。

ハンドラの戻り値は、ハンドラの呼び出しが終了した後、実行中のタスクツリーにどのように処理を進めるかを指示します。SetupResult::Continue の戻り値は、タスクツリーに対して実行を継続する、つまり関連付けられたTask を実行するよう指示します。SetupResult::StopWithSuccess またはSetupResult::StopWithError の戻り値は、タスクツリーに対してタスクの実行をスキップし、それぞれ成功またはエラーとして直ちに終了するよう指示します。

戻り値の型がSetupResult::StopWithSuccess またはSetupResult::StopWithError のいずれかである場合、タスクの done ハンドラ(指定されている場合)はその後呼び出されません。

カスタムタスクのコンストラクタは、std::function<void(Task &)> という短縮形式の関数も受け付けます。つまり、戻り値はvoid となります。この場合、戻り値はSetupResult::Continue であるとみなされます。

QCustomTask()、TaskDoneHandler 、およびGroupSetupHandlerも参照してください 。

メンバ関数のドキュメント

[explicit] template < typename SetupHandler = QtTaskTree::QCustomTask<Task, Adapter, Deleter>::TaskSetupHandler, typename DoneHandler = QtTaskTree::QCustomTask<Task, Adapter, Deleter>::TaskDoneHandler, std::enable_if_t<!std::is_same_v<q20::remove_cvref_t<SetupHandler>, QCustomTask<Task, Adapter, Deleter>>, bool> = true > QCustomTask::QCustomTask(SetupHandler &&setup = QCustomTask::TaskSetupHandler(), DoneHandler &&done = QCustomTask::TaskDoneHandler(), QtTaskTree::CallDone callDone = QtTaskTree::CallDoneFlag::Always)

QCustomTaskのインスタンスを生成し、setup およびdone ハンドラをそのタスクに紐付けます。 実行中のタスクツリーがタスクを開始しようとする際、関連付けられたTask オブジェクトをインスタンス化し、作成されたタスクへの参照を引数としてsetup ハンドラを呼び出し、タスクを開始します。実行中のタスクが終了すると、タスクツリーは、作成されたタスクへのconst 参照を引数としてdone ハンドラを呼び出します。

渡されるsetup ハンドラは、TaskSetupHandler 型です。例:

static void parseAndLog(const QString &input);

...

const QString input = ...;

const auto onFirstSetup = [input](QThreadFunction<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.setThreadFunctionData(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](QThreadFunction<void> &task) {
    task.setThreadFunctionData(parseAndLog, input);
};

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

done ハンドラはTaskDoneHandler 型です。デフォルトでは、タスクが終了するたびにdone ハンドラが呼び出されます。実行が成功、失敗、またはキャンセルされた場合にのみハンドラを呼び出したい場合は、callDone 引数にデフォルト値以外の値を指定してください。

「 TaskSetupHandler 」および「TaskDoneHandler 」も参照してください 。

関連する非メンバー

[alias] QBarrierTask

QCustomTask<QBarrier> の型エイリアス。レシピ内で使用するためのものです。

[alias] QNetworkReplyWrapperTask

QCustomTask<QNetworkReplyWrapper> の型エイリアス。レシピ内で使用するためのものです。

[alias] QProcessTask

QCustomTask<QProcess> の型エイリアス。QProcessTaskDeleter を使用し、レシピ内で利用できるようにする。

[alias] QTaskTreeTask

QCustomTask<QTaskTree> の型エイリアス。レシピ内で使用するためのものです。

[alias] QTcpSocketWrapperTask

QCustomTask<QTcpSocketWrapper> の型エイリアス。レシピ内で使用するためのものです。

[alias] template <typename ResultType> QThreadFunctionTask

QCustomTask<QThreadFunction<ResultType>> の型エイリアス。ここで、ResultType はスレッド関数の戻り値型を指定し、レシピ内で使用されます。

[alias] QTimeoutTask

QCustomTask<std::chrono::milliseconds> の型エイリアスで、レシピ内で使用されます。std::chrono::milliseconds は、タイムアウト時間を設定するために使用されます。デフォルトのタイムアウトはstd::chrono::milliseconds::zero() であり、つまり、制御が実行中のイベントループに戻り次第、QTimeoutTask は終了します。

使用例:

using namespace std::chrono;
using namespace std::chrono_literals;

const auto onSetup = [](milliseconds &timeout) { timeout = 1000ms; }
const auto onDone = [] { qDebug() << "Timed out."; }

const Group root {
    QTimeoutTask(onSetup, onDone)
};

timeoutTask()も参照してください 。

© 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.