方法: 手動タスク キューを作成する
例
タスクキューの作業と完了に使用されるスレッドを明示的に制御する必要がある場合があります。 このような場合は、手動タスク キューを作成して、自分で呼び出しをディスパッチできます。 手動タスク キューを使用する開発者は、Windows メッセージ キューもポンプする必要があります。
次の例は、手動でポンプされるタスクキューを作成する方法を示しています。 作業ポートと完了ポート両方の呼び出しをディスパッチする 2 つの STL スレッドを作成します。
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 thread for the work port
// and one thread for the completion port.
std::thread workThread([queue]
{
// XTaskQueueDispatch returns false when there's nothing to
// dispatch. Here, we wait forever for something new to come
// in. This will return false only if the queue is being
// terminated.
while (XTaskQueueDispatch(queue, XTaskQueuePort::Work, INFINITE));
});
std::thread completionThread([queue]
{
// XTaskQueueDispatch returns false when there's nothing to
// dispatch. Here, we wait forever for something new to come
// in. This will return false only if the queue is being
// terminated.
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 XTaskQueueDispatch to return
// false.
XTaskQueueTerminate(queue, true, nullptr, nullptr);
workThread.join();
completionThread.join();
}