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 主机