次の方法で共有


XTaskQueueSubmitDelayedCallback

特定のポートのキューにコールバックを送信します。

構文

HRESULT XTaskQueueSubmitDelayedCallback(  
         XTaskQueueHandle queue,  
         XTaskQueuePort port,  
         uint32_t delayMs,  
         void* callbackContext,  
         XTaskQueueCallback* callback  
)  

パラメーター

queue _In_
型: XTaskQueueHandle

コールバックの送信先のキュー。

port _In_
型: XTaskQueuePort

コールバックの送信先のポート。 コールバックは、処理ポートまたは完了ポートに割り当てることができます。

delayMs _In_
型: uint32_t

キューにコールバックを送信するまでの遅延時間 (ミリ秒単位)。

注意

将来のある時点でキューに追加されるようにコールバックを送信できます。 delayMs が 0 以外の場合、コールバックは保留リストに入り、2 番目に早い待機時間でタイマーが初期化されます。 時間が経過すると、次の時間のコールバックが実行一覧に入ります。 キューによって XTaskQueueMonitorCallback が生成されます。キューがスレッド プール ディスパッチ モードで実行している場合は、スレッド プールの作業が送信されます。

callbackContext _In_opt_
型: void*

コールバックに渡されるオプションのコンテキスト ポインター。

callback _In_
型: XTaskQueueCallback*

コールバック関数に対するポインター。

戻り値

型: HRESULT

HRESULT 成功またはエラー コード。

解説

このコールバックは、delayMs ミリ秒後にキューに追加されます。

alert パフォーマンス 注:
キューへのアイテムの追加は、上流コードのパフォーマンス要件を満たすためには、ロック フリーかつ待機フリーであることが必要です。 次の API はロック フリーです。

次の例では、XTaskQueueSubmitDelayedCallback 関数を使用すると、将来コールバックを送信できるようになります。 これは失敗したコールを少し遅れて再試行する優れた方法です。また、定期的なイベント用の低コストのタイマーとして使用することもできます。

注意

SubmitCallback は、XTaskQueueSubmitCallback 関数のコード例で定義されているヘルパー関数です。

void SubmittingDelayedCallback()
{
    XTaskQueueHandle queue;

    HRESULT hr = XTaskQueueCreate(
        XTaskQueueDispatchMode::ThreadPool,
        XTaskQueueDispatchMode::ThreadPool, 
        &queue);

    if (FAILED(hr))
    {
        printf("failed to create task queue: 0x%x\r\n", hr);
        return;
    }

    struct CallContext
    {
        DWORD count;
        XTaskQueueHandle queue;
        XTaskQueueCallback* callback;
    } callContext;

    auto callback = [](void* context, bool cancel)
    {
        CallContext *callContext = static_cast<CallContext*>(context);
        callContext->count++;
        printf("Periodic callback %d\r\n", callContext->count);
        if (callContext->count != 10 && !cancel)
        {
            HRESULT hr = XTaskQueueSubmitDelayedCallback(
                callContext->queue, 
                XTaskQueuePort::Completion, 
                500, 
                callContext, 
                callContext->callback);

            if (FAILED(hr))
            {
                printf("Failed submitting next callback: 0x%x\r\n", hr);
                callContext->count = 10; // Prevent us from waiting forever.
            }
        }
    };

    callContext.count = 0;
    callContext.queue = queue;
    callContext.callback = callback;

    // Use the task queue to make 10 periodic calls
    hr = XTaskQueueSubmitDelayedCallback(
        queue,
        XTaskQueuePort::Completion,
        500,
        &callContext,
        callback);

    if (FAILED(hr))
    {
        printf("Failed submitting delayed callback: 0x%x\r\n", hr);
        XTaskQueueCloseHandle(queue);
        return;
    }

    // Now wait for all the calls to complete.
    while (callContext.count != 10)
    {
        Sleep(1000);
    }

    XTaskQueueTerminate(queue, true, nullptr, nullptr);
    XTaskQueueCloseHandle(queue);
}

要件

ヘッダー: XTaskQueue.h

ライブラリ: xgameruntime.lib

サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体

関連項目

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