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 ミリ秒後にキューに追加されます。
パフォーマンス 注:
キューへのアイテムの追加は、上流コードのパフォーマンス要件を満たすためには、ロック フリーかつ待機フリーであることが必要です。 次の API はロック フリーです。
- XTaskQueueSubmitCallback
- XTaskQueueSubmitDelayedCallback
- XTaskQueueDispatch, provided that 0 is passed for timeoutInMs
次の例では、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 本体