Usar elementos de trabajo
Advertencia
UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los controladores UMDF nuevos deben escribirse con UMDF 2. No se agregan nuevas características a UMDF 1 y hay compatibilidad limitada con UMDF 1 en versiones más recientes de Windows 10. Los controladores universales de Windows deben usar UMDF 2.
Los ejemplos de UMDF 1 archivados se pueden encontrar en la actualización de ejemplos de controladores de Windows 11, versión 22H2 - mayo de 2022.
Para obtener más información, consulta Introducción con UMDF.
Un elemento de trabajo es una tarea que realiza un controlador en una función de devolución de llamada de eventos OnWorkItem . Estas funciones se ejecutan de forma asincrónica.
Los controladores UMDF suelen usar elementos de trabajo si onInterruptIsr debe realizar un procesamiento adicional sin retrasar la ejecución de la solicitud de servicio de interrupción (ISR) porque la línea de interrupción puede compartirse con varios dispositivos.
Normalmente, la función de devolución de llamada OnInterruptIsr de un controlador crea un objeto de elemento de trabajo y lo agrega a la cola del elemento de trabajo del sistema. Posteriormente, un subproceso de grupo de subprocesos quita el objeto y llama a la función de devolución de llamada OnWorkItem del elemento de trabajo.
Configuración de un elemento de trabajo
Para configurar un elemento de trabajo, el controlador debe:
Cree el elemento de trabajo.
El controlador llama a IWDFDevice3::CreateWorkItem para crear un objeto de elemento de trabajo e identificar una función de devolución de llamada OnWorkItem que procesará el elemento de trabajo.
Almacenar información sobre el elemento de trabajo.
Normalmente, los controladores usan la memoria de contexto del objeto de elemento de trabajo para almacenar información sobre la tarea que debe realizar la función de devolución de llamada OnWorkItem . Cuando se llama a la función de devolución de llamada OnWorkItem , puede recuperar la información accediendo a esta memoria de contexto. Para obtener información sobre cómo asignar y acceder a la memoria de contexto, veaIWDFObject::AssignContext.
Agregue el elemento de trabajo a la cola del elemento de trabajo del sistema.
El controlador llama a IWDFWorkItem::Enqueue, que agrega el elemento de trabajo del controlador a la cola de elementos de trabajo.
Cuando el controlador llama a IWDFDevice3::CreateWorkItem, puede proporcionar opcionalmente un objeto primario (por ejemplo, un objeto de dispositivo o un objeto de cola). Cuando el sistema elimina ese objeto, también elimina los elementos de trabajo existentes asociados al objeto .
Uso de la función de devolución de llamada WorkItem
Una vez agregado el elemento de trabajo a la cola de elementos de trabajo, permanece en la cola hasta que un subproceso de trabajo del sistema esté disponible. El subproceso de trabajo del sistema quita el elemento de trabajo de la cola y, a continuación, llama a la función de devolución de llamada OnWorkItem del controlador, pasando el objeto de elemento de trabajo como entrada.
Normalmente, la función de devolución de llamada OnWorkItem realiza los pasos siguientes:
- Obtiene información proporcionada por el controlador sobre el elemento de trabajo accediendo a la memoria de contexto del objeto de elemento de trabajo.
- Realiza la tarea que especificó. Si es necesario, la función de devolución de llamada puede llamar a IWDFWorkItem::GetParentObject para determinar el objeto primario del elemento de trabajo.
- Si el controlador volverá a poner en cola el elemento de trabajo, indica que el identificador del elemento de trabajo ya está disponible para su reutilización.
Es posible que algunos controladores deban llamar a IWDFWorkItem::Flush para vaciar sus elementos de trabajo de la cola de elementos de trabajo. Si un controlador llama al método Flush , el método no vuelve hasta que un subproceso de trabajo ha quitado el elemento de trabajo especificado de la cola de elementos de trabajo y ha llamado a la función de devolución de llamada OnWorkItem del controlador y la función de devolución de llamada OnWorkItem se ha devuelto posteriormente después de procesar el elemento de trabajo.