次の方法で共有


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 本体

関連項目

XTaskQueue のメンバー
非同期プログラミング モデル
非同期タスク キューの設計