次の方法で共有


方法: 複合タスク キューを作成する

複合タスク キューとは、他のキューのパーツで構成されたタスク キューのことです。 複合タスク キューは、ある非同期タスクが別のタスクを呼び出す必要があり、そのタスクの完了が、完了スレッドのサイクルを浪費してはならない中間ステップである場合に役立ちます。 この場合、複合キューを作成できます。 この複合キューの処理ポートと完了ポートの両方が元のキューの処理ポートを使用します。

次のサンプルでは、処理のためにスレッド プールを使用しますが、完了ポート コールバックを 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);  
}  

これに関するもう 1 つのテクニックとしては、処理と完了のディスパッチ タイプが即時であるローカル キューの作成が挙げられます。 即時ディスパッチ モードには非同期アクティビティは含まれません。次のコード サンプルで示されているように、コールバックが送信されると同時にディスパッチされます。

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);  
}  

関連項目

タスク キューの設計