Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Создает рабочую очередь, которая гарантированно сериализует рабочие элементы. Последовательная рабочая очередь служит оболочкой для существующей многопоточной рабочей очереди. Последовательная рабочая очередь применяет порядок выполнения в порядке первого входа (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 |