XTaskQueueCreateComposite
他のタスク キューのポートで構成されるタスク キューを作成します。
HRESULT XTaskQueueCreateComposite(
XTaskQueuePortHandle workPort,
XTaskQueuePortHandle completionPort,
XTaskQueueHandle* queue
)
workPort _In_
型: XTaskQueuePortHandle
処理コールバックをキューイングするために使用するポート。
completionPort _In_
型: XTaskQueuePortHandle
完了コールバックをキューイングするために使用するポート。
queue _Out_
型: XTaskQueueHandle*
新しく作成されたキュー。
型: HRESULT
HRESULT 成功またはエラー コード。
注意
この関数は、時間依存のスレッドで呼び出すのに安全ではありません。 詳細については、「時間依存のスレッド」を参照してください。
タスク キューは参照カウントされるオブジェクトです。 XTaskQueueCloseHandle を呼び出して、参照を解放します。
タスク キューには処理ポートと完了ポートがあり、タスクはどちらのポートにもキューイングできます。 各ポートを、独自のディスパッチ モードで構成できます。
ほとんどのシナリオでは、XTaskQueueCreate API でタスク キューを作成します。 ただし、複数の非同期呼び出しをチェーンする場合は、XTaskQueueCreateComposite で複合キューを作成すると便利な場合があります。 タスク キューを使用する別の API を呼び出す必要がある API の実装を考えてみてください。 呼び出し元の完了スレッドを縛り付けないように、API の完了コールバックをリダイレクトすることが必要な場合があります。 この場合は、処理ポートと完了ポートが別のキューの処理ポートから構築されている複合タスク キューを作成することができます。
次の例では、複合タスク キューを作成します。
void CreatingCompositeQueue()
{
XTaskQueueHandle queue;
HRESULT hr = XTaskQueueCreate(
XTaskQueueDispatchMode::ThreadPool,
XTaskQueueDispatchMode::Manual,
&queue);
if (FAILED(hr))
{
printf("failed to create task queue: 0x%x\r\n", hr);
return;
}
XTaskQueuePortHandle workPort;
// Create a composite queue that uses the work port from
// another queue for both work and completion ports.
hr = XTaskQueueGetPort(queue, XTaskQueuePort::Work, &workPort);
if (FAILED(hr))
{
printf("failed to get work port 0x%x\r\n", hr);
XTaskQueueCloseHandle(queue);
return;
}
XTaskQueueHandle compositeQueue;
hr = XTaskQueueCreateComposite(workPort, workPort, &compositeQueue);
if (FAILED(hr))
{
printf("failed to create composiute queue 0x%x\r\n", hr);
XTaskQueueCloseHandle(queue);
return;
}
// Use the queue as needed
SubmitCallbacks(compositeQueue);
// Wait a while for the callbacks to run
Sleep(1000);
XTaskQueueCloseHandle(compositeQueue);
XTaskQueueCloseHandle(queue);
}
ヘッダー: XTaskQueue.h
ライブラリ: xgameruntime.lib
サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体