Información general sobre la API de cola de tareas
Una cola de tareas es una composición de dos puertos de cola: un puerto de trabajo y un puerto de finalización. Estos puertos se agrupan en el mismo objeto porque a menudo se necesitan ambos: el puerto de trabajo para realizar el trabajo asincrónico y el puerto de finalización para informar de ello al usuario. Una cola de tareas se describe de la siguiente manera.- Contiene dos puertos de cola de tareas.
- Cada puerto de cola de tareas puede tener su propio modo de distribución, que dicta cómo se distribuyen los elementos de la cola.
- Los modos de distribución van desde la distribución totalmente automática a través del grupo de subprocesos del sistema hasta la distribución totalmente manual, en la que las tareas deben eliminarse explícitamente.
- Las devoluciones de llamada pueden enviarse a cualquiera de los puertos de la cola.
- Las colas se representan como identificadores. Los identificadores pueden duplicarse, lo que esencialmente incrementa un recuento de referencias en la cola.
- Grupo de subprocesos: las devoluciones de llamada puestas en cola en una cola de grupo de subprocesos se ejecutan en el grupo de subprocesos del sistema. El grupo de subprocesos invoca las llamadas en paralelo, tomando por turnos una llamada de la cola para ejecutarla a medida que los subprocesos del grupo quedan disponibles.
- Grupo de subprocesos serializado: las devoluciones de llamada se ponen en cola y se ejecutan en el grupo de subprocesos, pero se ejecutan una tras otra en lugar de ejecutarse en paralelo en todos los subprocesos del grupo.
- Manual: las devoluciones de llamada puestas en cola en una cola manual no se distribuyen automáticamente. Corresponde a usted distribuirlas en el subproceso que desee. Si usa colas de tareas manuales, debe asegurarse de procesar también la cola de mensajes de Windows.
- Inmediato: el modo de distribución inmediato no pone nada en cola. Ejecuta inmediatamente la llamada en el subproceso que envió la devolución de llamada.
XTaskQueueDuplicateHandle,
XTaskQueueSubmitCallback, XTaskQueueSubmitDelayedCallback y
XTaskQueueCreateComposite agregan todos una referencia al identificador de la cola. Esto
significa que la cola no se destruye realmente hasta que todas las devoluciones de llamada
se han completado.
Un identificador de cola de tareas es un recurso por proceso y no puede serializarse ni
usarse fuera del proceso.
Patrón de uso
El patrón de uso típico de una cola de tareas es el siguiente.- Cree un identificador de cola de tareas y, después, especifique los modos de distribución para cada puerto.
- Si usa la distribución manual, establezca subprocesos específicos de la aplicación para llamar a la función de distribución de la cola.
-
Use la cola como parámetro en las llamadas de Microsoft Game Development Kit (GDK) o envíe directamente
mediante
XTaskQueueCallback. - Opcionalmente, termine la cola de tareas cuando se cierre la aplicación.
Temas de procedimientos de colas de tareas asincrónicas
En esta sección se proporcionan ejemplos de procedimientos para escenarios comunes de colas de tareas asincrónicas.En esta sección
Creación de una cola de tareas de grupo de subprocesos Proporciona un ejemplo que muestra cómo crear una cola de tareas que distribuya tanto las devoluciones de llamada de trabajo como las de finalización en el grupo de subprocesos del sistema. Envío de devoluciones de llamada Proporciona un ejemplo que muestra cómo se envía una devolución de llamada al puerto de trabajo o al puerto de finalización de una cola de tareas. Duplicación de un identificador de cola de tareas Proporciona un ejemplo que muestra cómo duplicar un identificador de cola de tareas. Si tiene trabajo de larga duración, puede que quiera duplicar el identificador de la cola de tareas mientras dure el trabajo. De esta manera, cualquiera que llame aXTaskQueueCloseHandle no cerrará la cola mientras usted todavía la necesite.
Creación de una cola de tareas manual
Proporciona un ejemplo que muestra cómo crear una cola de tareas procesada manualmente. Crea dos subprocesos STL que distribuyen las llamadas tanto para el puerto de trabajo como para el puerto de finalización.
Uso de eventos para controlar la distribución manual de colas
Proporciona un ejemplo que muestra cómo usar una cola de tareas para señalar una variable de condición cuando tiene elementos que distribuir.
Uso de una cola de tareas con un bucle de mensajes de Windows
Proporciona un ejemplo que usa el grupo de subprocesos para el trabajo, pero integra las devoluciones de llamada del puerto de finalización en un procedimiento de ventana de Win32. Este ejemplo también muestra la terminación correcta de una cola de tareas cuando se integra con otro modelo de subprocesos.
Uso de la cola de tareas del proceso
Proporciona un ejemplo que muestra cómo usar la cola de tareas del proceso. La cola de tareas del proceso predeterminada usa el grupo de subprocesos tanto para la distribución del trabajo como de las finalizaciones.
Creación de una cola de tareas compuesta
Proporciona un ejemplo que usa el grupo de subprocesos para el trabajo, pero integra las devoluciones de llamada del puerto de finalización en una función de devolución de llamada WindowProc de Win32. Este ejemplo también muestra la terminación correcta de una cola de tareas cuando se integra con otro modelo de subprocesos.
Uso de devoluciones de llamada retrasadas
Proporciona un ejemplo que muestra cómo usar devoluciones de llamada retrasadas, invocando 10 devoluciones de llamada, una cada 500 ms. Use una cola de tareas para enviar devoluciones de llamada en el futuro mediante la API XTaskQueueSubmitDelayedCallback. De esta manera, puede reintentar una llamada con error después de un breve retraso, o usarla como un temporizador económico para eventos periódicos.
Uso de un elemento de espera de cola de tareas
Proporciona un ejemplo que muestra cómo usar un elemento de espera de cola de tareas. Puede registrar un identificador de kernel de Win32 con una cola de tareas. Su devolución de llamada se enviará a la cola cuando el identificador reciba una señal.
