방법: 복합 작업 큐 만들기
예시
복합 작업 큐e는 다른 큐의 부분으로 구성된 작업 큐입니다. 표준 작업 큐는 비동기 작업이 다른 작업을 호출해야 할 때 유용하고, 해당 작업에서의 완료는 완료 스레드에서 주기를 낭비하지 말아야 하는 중간 단계입니다. 이러한 경우 복합 큐를 만들 수 있습니다. 이 복합 큐의 작업 및 완료 포트는 모두 원래 큐의 작업 포트를 사용합니다.
다음 예는 작업에 대한 스레드 풀을 사용하지만 완료 포트 콜백을 Win32 WindowProc 콜백 함수에 통합합니다. 또한 다른 스레딩 모델과 통합하는 경우 작업 큐의 올바른 종료 방법을 보여줍니다.
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 the work and the 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 composite 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);
}
이를 위한 또 다른 방법은 작업 및 완료 디스패치 유형이 즉시인 로컬 큐를 만드는 것입니다. 즉시 디스패치 모드는 다음 코드 예제와 같이 제출되는 즉시 모든 콜백에서 비동기 활동을 포함하지 않습니다.
void CreatingImmediateQueue()
{
XTaskQueueHandle queue;
HRESULT hr = XTaskQueueCreate(
XTaskQueueDispatchMode::Immediate,
XTaskQueueDispatchMode::Immediate,
&queue);
if (FAILED(hr))
{
printf("Failed to create task queue: 0x%x\r\n", hr);
return;
}
// Use the queue as needed.
SubmitCallbacks(queue);
// Wait a while for the callbacks to run.
Sleep(1000);
XTaskQueueCloseHandle(queue);
}