Функция MFAllocateSerialWorkQueue (mfapi.h)
Создает рабочую очередь, которая гарантированно сериализует рабочие элементы. Последовательная рабочая очередь служит оболочкой для существующей многопоточной рабочей очереди. Последовательная рабочая очередь применяет порядок выполнения в порядке первого входа (FIFO).
Синтаксис
HRESULT MFAllocateSerialWorkQueue(
[in] DWORD dwWorkQueue,
[out] DWORD *pdwWorkQueue
);
Параметры
[in] dwWorkQueue
Идентификатор существующей рабочей очереди. Это должна быть многопоточная очередь или другая последовательная рабочая очередь. Можно использовать любое из следующих средств:
- Рабочая очередь по умолчанию (MFASYNC_CALLBACK_QUEUE_STANDARD)
- Многопоточность платформы (MFASYNC_CALLBACK_QUEUE_MULTITHREADED)
- Многопоточность очереди, возвращаемая функцией MFLockSharedWorkQueue .
- Последовательная очередь, созданная функцией MFAllocateSerialWorkQueue .
[out] pdwWorkQueue
Получает идентификатор для новой последовательной рабочей очереди. Используйте этот идентификатор при постановке рабочих элементов в очередь.
Возвращаемое значение
Эта функция может возвращать одно из этих значений.
Код возврата | Описание |
---|---|
|
Функция выполнена успешно. |
|
Приложение превысило максимальное число рабочих очередей. |
|
Приложение не вызывало MFStartup, или приложение уже вызывало MFShutdown. |
Комментарии
Завершив работу с рабочей очередью, вызовите MFUnlockWorkQueue.
Многопоточные очереди используют пул потоков, что позволяет сократить общее количество потоков в конвейере. Однако они не сериализуют рабочие элементы. Последовательная рабочая очередь позволяет приложению получить преимущества пула потоков без необходимости выполнять сериализацию собственных рабочих элементов вручную.
Режим ответа
Очередь сериализатора также может работать в режиме ответа. Если метод IMFAsyncCallback::GetParameters вызывающей стороны возвращает флаг MFASYNC_REPLY_CALLBACK , очередь сериализатора не будет автоматически переходить к следующему рабочему элементу. Вместо этого очередь ожидает ответа от вызывающей стороны. Вызывающий объект сообщает ответ, вызывая асинхронный результирующий объект, который рабочая очередь передает методу Invoke . В следующем коде показано, как вызывающий объект сигнализирует рабочей очереди.HRESULT CCallback::Invoke(IMFAsyncResult *pResult)
{
DoSomeWork();
// Reply to the work queue that you are done.
MFInvokeCallback(pResult);
// Note: This call to MFInvokeCallback does not have to occur inside the
// Invoke method. You could call MFInvokeCallback at a later time.
return S_OK;
}
HRESULT CCallback::GetParameters(DWORD *pdwFlags, DWORD *pdwQueue)
{
*pdwFlags = MFASYNC_REPLY_CALLBACK;
*pdwQueue = m_QueueId;
return S_OK;
}
Требования
Минимальная версия клиента | Windows 8 [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2012 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | mfapi.h |
DLL | Mfplat.dll |