Tasks System は UE::Tasks
名前空間に存在します。Tasks System を使用するには、 Tasks/Task.h
ライブラリをインクルードする必要があります。使用例については、 Tests/Tasks/TasksTest.cpp
クラスを参照してください。
Tasks System の主要関数について、いつくかの例を以下の参照の表に示します。
参照 | 説明 |
---|---|
TTask<ResultType>() |
実際のタスクのハンドル。 参照カウントを使用して、タスクの有効期間を管理します。
|
TTask<ResultType>::IsValid() |
関数
タスク ハンドルがタスクを参照している場合に true を返します。デフォルトの構築されたタスク ハンドルは「empty」であり、「無効」です。タスクは起動時に構築されます。次はその例です。次に例を示します。
|
Task<ResultType>::Launch |
非同期で実行するためにタスクを起動します。以下のコード例では Launch をタスクに使用し、そのハンドルを返しています。
前提条件は、タスクが依存関係を持ち、そのタスクよりも前に完了している必要のある他のタスクが実行済みになっていることです。すべての前提条件が完了すると、タスクには自動的に実行に向けてスケジュールされます。
パラメータ:
例:
|
TTask<ResultType>::IsCompleted |
タスクが完了済みまたは無効な場合に true を返します。
タスクの実行が終了していてすべてのネストされたタスクが完了済みの 場合 、タスクは完了済みです。 例:
追加の例は、次のタスクで確認できます。 |
TTask<ResultType>::Wait |
タスクが完了するか、または待機がタイムアウトになるまで現在のスレッドをブロックします。タイムアウト時には false を返します。待機は、指定したタイムアウト値よりも長くすることができます。
例:
タスクの実行がまだ開始されない (前提条件によってブロックされているか、またはワーカー スレッドによってまだ選択されていない) 場合にタスクを待機すると、そのタスクは「退避」され、ローカル (インライン) で実行されます。タスクの実行はまだ開始されていないため、ワーカー スレッドがタスクを実行する間、待機中のスレッドはブロックする必要があります。待機中のスレッドによるタスクの実行は低速な処理ではなく、高速にすることができ、ワーカー スレッドを占有しません。 タスクの退避は、タスクの依存関係に従って行われ、「詳細なタスク退避」と呼ばれています。タスクの実行が前提条件によってブロックされた場合、タスクの退避では、再帰的に前提条件を退避して実行することで、そのタスクのブロック解除を試行します。 タスクの退避が何らかの理由 (タスクの実行がすでに開始されていたなど) で失敗した場合は、ブロック状態の待機にフォールバックします。 例:
上記のサンプルでは、3 つのタスクが起動されます。ここで、 |
TTask<ResultType>::BusyWait |
タスクをビジー状態で待機すると、そのタスクの完了を待機する間に他の関連しないタスクが実行されます。これによってシステムのスループットが向上する場合がありますが、これを使用する場合は注意が必要です。ビジー状態の待機はブロック状態の待機よりも時間がかかる可能性があり、レイテンシーに左右されやすいタスクチェーンに影響を与える場合があります。 以下の関数では、待機しているタスクが完了するまで、実行準備が完了した他のタスクが実行されます。その後、BusyWait に戻ってからそのタスクが完了されます。
以下のコード サンプルでは、待機しているタスクが完了するまで (または待機がタイム アウトになるまで)、実行準備が完了した他のタスクが実行されます。次に、タイムアウト時には false が返されます。待機は、指定したタイムアウト値よりも長くすることができます。BusyWait が true を返した場合、タスクは完了済みです。
関連しないタスクを実行する前に、ビジー状態で待機しているタスクの退避が試みられます。
|
TTask<ResultType>::GetResult |
タスクの実行の結果としてタスクによって返されたオブジェクトへの参照 (タスク ボディの実行によって返される値) を返します。
タスクが完了すると、この呼び出しに直ちに戻ります。完了しない場合、タスクが完了するまでブロックが継続します。 タスク オブジェクトが破棄されると、結果のオブジェクトは破棄されます。これは、タスク オブジェクトへの最後の参照の解放時に行われます。 タスクが無効な場合、この呼び出しではアサーションが行われます。 例:
|
AddNested() |
与えられたタスクを「現在の」タスク (親タスク) に対して「ネスト」して登録します。この 現在のタスク は現在のスレッドによって実行中のタスクです。 親タスク は、ネストされたすべてのタスクが完了するまで完了しません。 別の内部のタスクから呼び出された場合にはアサーションを行いません。
例:
|
FTaskEvent
FTaskEvent は、API の一部を TTask<ResultType>
と共有しています。たとえば、 IsValid()
、 IsCompleted()
、待機、およびビジー状態の待機の API は同じです。このセクションでは、FTaskEvent に固有の API のみについて説明します。
参照タスク イベント | 説明 |
---|---|
FTaskEvent Constructor |
与えられたデバッグ名でタスク イベント オブジェクトを作成します。TTask
タスク イベントは、破棄される前にトリガーする必要があります。 例:
与えられたデバッグ名でパイプ オブジェクトを作成します。デバッグ名は、デバッグ目的でパイプ オブジェクトを特定するために使用されます。
パイプは、軽量なコピー不可かつ移動不可のオブジェクトです。パイプを作成しても、動的メモリは割り当てられず、負荷が高い処理は実行されません。 |
FTaskEvent::AddPrerequisites |
他のタスク (またはタスク イベント) を前提条件として追加します。タスク イベントのトリガー前にのみ呼び出すことができます。すべての前提条件が完了済みかつタスク イベントがトリガー済みの場合にのみ、「完了」(「シグナリング」) となります。
例:
|
FTaskEvent::Trigger |
タスク イベントはトリガーされるまで未完了 (「非シグナリング」) です。タスク イベントをトリガーしても、必ずしもシグナリングになるわけではありません。すべての前提条件が完了済みかつタスク イベントがトリガー済みの場合にのみ、「完了」(「シグナリング」) となります。 すべてのタスク イベントは、トリガーする必要があります。そうしないと、デストラクタによって、タスク イベントが完了済みかどうかのアサーションが行われます。
|
FPipe
パイプは、軽量なコピー不可かつ移動不可のオブジェクトです。パイプを作成しても、動的メモリは割り当てられず、負荷が高い処理は実行されません。
参照名 | 説明 |
---|---|
FPipe constructor |
与えられたデバッグ名でタスク イベント オブジェクトを作成します。TTask
タスク イベントは、破棄される前にトリガーする必要があります。 例:
与えられたデバッグ名でパイプ オブジェクトを作成します。デバッグ名は、デバッグ目的でパイプ オブジェクトを特定するために使用されます。
パイプは、軽量なコピー不可かつ移動不可のオブジェクトです。パイプを作成しても、動的メモリは割り当てられず、負荷が高い処理は実行されません。 |
FPipe destructor |
パイプに未完了のタスクがないかどうかをチェックします。パイプの破棄時に未完了のタスクを残したままにはできません。 |
HasWork() |
パイプに未完了のタスクがないかどうかをチェックします。パイプの破棄時に未完了のタスクを残したままにはできません。
|
WaitUntilEmpty() |
この呼び出しは、すべてのパイプのタスクが完了するまでブロックを行います。
追加の例については、関数 |
Launch() |
パイプ内のタスクを起動します。同じパイプで起動されたタスクは、同時に実行されるわけではありません (順次実行されます)。ただし、異なるワーカー スレッドで実行できます。
|
IsInContext() |
このパイプに属するタスクの内部から呼び出された場合、true を返します。パイプされたタスクによって実行中のスコープがコードに含まれない場合など、パイプによって保護された共有リソースにアクセスするのが安全かどうかをチェックするために使用できます。
|