XTaskQueueDispatch
处理给定端口的任务队列中的项。
语法
bool XTaskQueueDispatch(
XTaskQueueHandle queue,
XTaskQueuePort port,
uint32_t timeoutInMs
)
参数
queue _In_
类型:XTaskQueueHandle
要调度工作的队列。
port _In_
类型:XTaskQueuePort
要调度的端口。
timeoutInMs _In_
类型:uint32_t
在返回 false 前等待工作到达的毫秒数。 可以传递 INFINITE 来永久等待。
返回值
类型:bool
如果此函数调度了一个调用,则返回 true;否则返回 false。 如果队列已终止,即使传递了 INFINITE 作为超时值,此函数也将返回 false。
备注
您可以传递超时值,这将导致 XTaskQueueDispatch 等待队列中的某项到达。
如果任务队列端口是使用 XTaskQueueDispatchMode::ThreadPool、XTaskQueueDispatchMode::SerializedThreadPool 或 XTaskQueueDispatchMode::Immediate 创建的,调度模式将自动调度回调。 对于手动调度端口,您需要调用 XTaskQueueDispatch。 可以为任何调度模式调用 XTaskQueueDispatch,但是请注意一个调用始终在调用 XTaskQueueDispatch 的线程上调度。
性能注意事项:
将某项添加到队列需要锁定并等待释放,以便满足上游代码的性能要求。 以下 API 是无锁的:
- XTaskQueueSubmitCallback
- XTaskQueueSubmitDelayedCallback
- XTaskQueueDispatch,前提是将 0 传递给 timeoutInMs
性能注意事项:
从工作端口处理项时,XTaskQueueDispatch 所用的时间是可变的,并且取决于正在执行的工作。
在某些情况下,调用线程可能阻止等待其他系统工作完成。
以下示例显示如何使用 XTaskQueueDispatch 函数来处理任务队列中的项。
注意
SubmitCallback是一个帮助程序函数,它在代码示例中定义用于 XTaskQueueSubmitCallback 函数。
void CreatingTaskQueueWithManualThreads()
{
// Create a manual task queue
XTaskQueueHandle queue;
HRESULT hr = XTaskQueueCreate(XTaskQueueDispatchMode::Manual, XTaskQueueDispatchMode::Manual, &queue);
if (FAILED(hr))
{
printf("Creating queue failed: 0x%x\r\n", hr);
return;
}
// We create threads to pump the queue: one for the work port
// and one for the completion port.
std::thread workThread([queue]
{
while (XTaskQueueDispatch(queue, XTaskQueuePort::Work, INFINITE));
});
std::thread completionThread([queue]
{
while (XTaskQueueDispatch(queue, XTaskQueuePort::Completion, INFINITE));
});
SubmitCallbacks(queue);
// Wait a while for the callbacks to run
Sleep(1000);
// Terminating the queue will cause a waiting DispatchTaskQueue to return
// false.
XTaskQueueTerminate(queue, true, nullptr, nullptr);
workThread.join();
completionThread.join();
}
要求
头文件:XTaskQueue.h
库:xgameruntime.lib
支持平台:Windows、Xbox One 系列主机和 Xbox Series 主机