このページでは

QtTaskTree::QCustomTask Class

template <typename Task, typename Adapter = QtTaskTree::QDefaultTaskAdapter<Task>, typename Deleter = std::default_delete<Task>> 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<リターン・タイプQThreadFunction<リターンタイプ非同期タスクを開始する。別スレッドで実行
QProcessTaskQProcessプロセスの開始
QNetworkReplyWrapperTaskQNetworkReplyWrapperネットワーク・クエリの送信
QTaskTreeTaskQTaskTreeネストされたタスク・ツリーの開始
QTcpSocketWrapperTaskQTcpSocketWrapperTCPコネクションの確立
QTimeoutTaskstd::chrono::millisecondsタイマーを開始する。

Task templateパラメータは必須で、実行中のQTaskTree がrecipeの一部であるときにインスタンス化するTask のタイプを指定する。Task 型はデフォルトで構築可能である必要がある。

Adapter template引数はオプションです。QDefaultTaskAdapter<Task>がTask のタイプに適応するのに問題ない場合、省略されるかもしれません。そうでない場合、特定のTask に対するAdapter は以下の形式を持つ必要がある:

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

上記のoperator()を実装してtask を開始し、タスクが終了したら渡されたifaceQTaskInterface::reportDone()メソッドを呼び出す。

渡されたTaskQTaskInterface は、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()、TaskSetupHandlerGroupDoneHandlerも参照のこと

[alias] QCustomTask::TaskSetupHandler

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

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

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

注意: タスクの開始は、スタート・ハンドラ内で自分で行わないでください。QTaskTree QTaskTree は、QCustomTask<Task, Adapter, Deleter> コンストラクタに渡された Adapter テンプレート・パラメータのおかげで、 タスクの開始方法をすでに知っています。

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

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

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

QCustomTask()、TaskDoneHandlerGroupSetupHandlerも参照

メンバ関数ドキュメント

[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 インスタンスを構築し、setupdone ハンドラをタスクにアタッチする。実行中のタスクツリーがタスクを開始しようとするとき、関連する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

QProcessTaskDeleter を使って、QCustomTask<QProcess> のエイリアスを作り、レシピの中で使う。

[alias] QTaskTreeTask

レシピの中で使われる、QCustomTask<QTaskTree> のエイリアスをタイプする。

[alias] QTcpSocketWrapperTask

レシピの中で使われる、QCustomTask<QTcpSocketWrapper> のエイリアスをタイプする。

[alias] template <typename ResultType> QThreadFunctionTask

QCustomTask<QThreadFunction<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.