XTaskQueueRegisterWaiter
将一个等待句柄注册到任务队列。
语法
HRESULT XTaskQueueRegisterWaiter(
XTaskQueueHandle queue,
XTaskQueuePort port,
HANDLE waitHandle,
void* callbackContext,
XTaskQueueCallback* callback,
XTaskQueueRegistrationToken* token
)
参数
queue _In_
类型:XTaskQueueHandle
要将回调提交到的队列。
port _In_
类型:XTaskQueuePort
要将回调提交到的端口。 可将回调分配给工作端口或完成端口。
waitHandle _In_
类型:HANDLE
要监视的句柄。
注意
这是等待句柄,收到信号后将导致调用回调。 等待句柄通常是自动或手动重置事件。 如果等待句柄已手动重置,只要事件收到信号,将反复调用回调。 如果这不是你想要的,请在回调中重置事件或取消注册等待回调。
callbackContext _In_opt_
类型:void*
将传递给回调的可选上下文指针。
callback _In_
类型:XTaskQueueCallback*
指向回调函数的指针。
token _Out_
类型:XTaskQueueRegistrationToken*
一个注册令牌。 可以将它传递给 XTaskQueueUnregisterWaiter 以取消注册等待。
返回值
类型:HRESULT
HRESULT 成功或错误代码。
备注
注意
在时间敏感线程上调用此函数是不安全的。 有关详细信息,请参阅时间敏感线程。
满足等待句柄时,任务队列将调用给定的回调。 这提供了一种高效方式来将项添加到任务队列以响应句柄收到信号。
以下示例将一个 Win32 内核句柄注册到任务队列。 该句柄收到信号时,将您的回调提交给队列。 通常,您将创建一个自动重置事件以供发送信号。 如果句柄未自动重置,只要句柄未收到信号在当前回调完成后会提交新回调。
void CreatingTaskQueueWaiter()
{
HANDLE waitEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
if (waitEvent == nullptr)
{
printf("Error creating wait handle: %d\r\n", GetLastError());
return;
}
XTaskQueueHandle queue;
HRESULT hr = XTaskQueueCreate(
XTaskQueueDispatchMode::ThreadPool,
XTaskQueueDispatchMode::ThreadPool,
&queue);
if (FAILED(hr))
{
printf("Error creating task queue: %x\n", hr);
CloseHandle(waitEvent);
return;
}
auto callback = [](void*, bool)
{
printf("Callback invoked.\r\n");
};
XTaskQueueRegistrationToken token;
hr = XTaskQueueRegisterWaiter(
queue,
XTaskQueuePort::Completion,
waitEvent,
nullptr,
callback,
&token);
if (FAILED(hr))
{
printf("Error registering task queue waiter: %x\n", hr);
CloseHandle(waitEvent);
XTaskQueueCloseHandle(queue);
return;
}
// Now, whenever our wait event becomes signaled the callback will be called.
for (uint32_t i = 0; i < 5; i++)
{
SetEvent(waitEvent);
Sleep(100);
}
// Note: unregistering the waiter is optional
XTaskQueueUnregisterWaiter(queue, token);
XTaskQueueCloseHandle(queue);
CloseHandle(waitEvent);
}
要求
头文件:XTaskQueue.h
库:xgameruntime.lib
支持平台:Windows、Xbox One 系列主机和 Xbox Series 主机