MFAllocateSerialWorkQueue 函数 (mfapi.h)

创建保证序列化工作项的工作队列。 串行工作队列包装现有的多线程工作队列。 串行工作队列强制执行先入先出(FIFO)执行顺序。

Syntax

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

多线程队列使用线程池,这可以减少管道中的线程总数。 但是,它们不会序列化工作项。 串行工作队列使应用程序能够获取线程池的优势,而无需对其自己的工作项执行手动序列化。

回复模式

序列化程序队列也可以在“回复”模式下工作。 如果调用方的 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;
}

要求

Requirement 价值
最低支持的客户端 Windows 8 [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2012 [桌面应用 |UWP 应用]
目标平台 Windows操作系统
Header mfapi.h
Library Mfplat.lib
DLL Mfplat.dll

另请参阅

Media Foundation Functions

工作队列和线程处理改进