Descripción de los problemas de subprocesos

En este tema se describen escenarios comunes de subprocesos para implementaciones de cliente de Microsoft Automatización de la interfaz de usuario y se explica cómo evitar problemas que pueden producirse si un cliente usa subprocesos incorrectamente.

Este tema contiene las siguientes secciones:

Automatización de la interfaz de usuario y el subproceso de interfaz de usuario

Debido a la forma en que Automatización de la interfaz de usuario usa mensajes de Windows, pueden producirse conflictos cuando una aplicación cliente intenta interactuar con su propia interfaz de usuario en el subproceso de la interfaz de usuario. Estos conflictos pueden provocar un rendimiento muy lento o incluso hacer que la aplicación deje de responder.

Si la aplicación cliente está pensada para interactuar con todos los elementos del escritorio, incluida su propia interfaz de usuario, debe realizar todas las llamadas Automatización de la interfaz de usuario desde un subproceso independiente. Esto incluye la búsqueda de elementos, por ejemplo, mediante IUIAutomationTreeWalker o el método IUIAutomationElement::FindAll y mediante patrones de control. Este subproceso no debe ser propietario de ninguna ventana y debe ser un subproceso de modelo de apartamento multiproceso (COM) Multithreaded Apartment (MTA) (uno que inicializa COM mediante una llamada a CoInitializeEx con la marca COINIT_MULTITHREADED ).

Es seguro realizar llamadas Automatización de la interfaz de usuario en un controlador de eventos Automatización de la interfaz de usuario, ya que siempre se llama al controlador de eventos en un subproceso que no es de interfaz de usuario. Sin embargo, al suscribirse a eventos que pueden originarse en la interfaz de usuario de la aplicación cliente, debe realizar la llamada a IUIAutomation::AddAutomationEventHandler o un método relacionado, en un subproceso que no sea de interfaz de usuario (que también debe ser un subproceso MTA). Quite los controladores de eventos que estén en el mismo subproceso.

Un cliente Automatización de la interfaz de usuario no debe usar varios subprocesos para agregar o quitar controladores de eventos. El comportamiento inesperado puede dar lugar si se agrega o quita un controlador de eventos mientras se agrega o quita otro en el mismo proceso de cliente.

Modelo de subprocesos para controladores de eventos

Un cliente Automatización de la interfaz de usuario debe usar el modelo de subprocesos MTA COM para los subprocesos que implementan controladores de eventos. El uso del modelo de apartamento uniproceso (STA) puede causar problemas, como impedir que los clientes quiten controladores de eventos del subproceso.

Afinidad de apartamento COM en Windows de 64 bits

Según la especificación COM, la duración de un objeto remoto se rige por la duración del apartamento donde se llama a la función CoCreateInstance para crear el objeto. Cuando el apartamento original se cierra, también se libera el objeto remoto.

Para Automatización de la interfaz de usuario clientes, este comportamiento COM puede significar que la duración del asistente remoto de 32/64 (creada por UIAutomationCore.dll) usada por un elemento de 32 bits se rige por la duración del apartamento del subproceso que creó el elemento. Si el cliente Automatización de la interfaz de usuario serializa el elemento en otro subproceso, el elemento se puede invalidar cuando se cierra el apartamento de origen. El cliente Automatización de la interfaz de usuario debe controlar estos problemas correctamente detectando errores al usar elementos de automatización serializado.

El mismo problema puede producirse con un cliente de Automatización de la interfaz de usuario de 32 bits que tiene elementos de 64 bits.

Conceptual

Obtener elementos de UI Automation

Suscribirse a eventos de Automatización de la interfaz de usuario

Información general sobre eventos de UI Automation

Otros recursos

INFO: Descripciones y funcionamiento de modelos de subprocesos OLE