Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Создает рабочую очередь, которая гарантирует сериализацию рабочих элементов. В очереди последовательной работы выполняется оболочка существующей многопоточной рабочей очереди. В очереди последовательной работы применяется порядок выполнения в первую очередь (FIFO).
Синтаксис
HRESULT MFAllocateSerialWorkQueue(
[in] DWORD dwWorkQueue,
[out] DWORD *pdwWorkQueue
);
Параметры
[in] dwWorkQueue
Идентификатор существующей рабочей очереди. Это должна быть многопоточная очередь или другая последовательная рабочая очередь. Можно использовать любой из следующих элементов:
- Рабочая очередь по умолчанию (MFASYNC_CALLBACK_QUEUE_STANDARD)
- Многопоточной очереди платформы (MFASYNC_CALLBACK_QUEUE_MULTITHREADED)
- Многопоточной очереди, возвращаемой функцией MFLockSharedWorkQueue .
- Последовательная очередь, созданная функцией MFAllocateSerialWorkQueue .
[out] pdwWorkQueue
Получает идентификатор новой последовательной рабочей очереди. Используйте этот идентификатор при очереди рабочих элементов.
Возвращаемое значение
Эта функция может возвращать одно из этих значений.
| Код возврата | Description |
|---|---|
|
Функция завершилась успешно. |
|
Приложение превысило максимальное количество рабочих очередей. |
|
Приложение не вызывало MFStartup или приложение уже назвало MFShutdown. |
Замечания
После завершения работы с рабочей очередью вызовите MFUnlockWorkQueue.
Многопоточные очереди используют пул потоков, который может уменьшить общее количество потоков в конвейере. Однако они не сериализуют рабочие элементы. Очередь последовательной работы позволяет приложению получить преимущества пула потоков без необходимости выполнять сериализацию собственных рабочих элементов вручную.
Режим ответа
Очередь сериализатора также может работать в режиме ответа. Если метод МВФAsyncCallback метода вызывающего объекта::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] |
| целевая платформа | Виндоус |
| Header | mfapi.h |
| Library | Mfplat.lib |
| DLL | Mfplat.dll |