Поделиться через


Функция 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

Получает идентификатор новой последовательной рабочей очереди. Используйте этот идентификатор при очереди рабочих элементов.

Возвращаемое значение

Эта функция может возвращать одно из этих значений.

Код возврата Description
S_OK
Функция завершилась успешно.
E_FAIL
Приложение превысило максимальное количество рабочих очередей.
MF_E_SHUTDOWN
Приложение не вызывало 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

См. также

Функции Media Foundation

Улучшения рабочей очереди и потоков