Compartir a través de


Descripción de los problemas de subprocesos

En este tema se describen escenarios comunes de subprocesos para las implementaciones de cliente de Automatización de la interfaz de usuario de Microsoft 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 la interfaz de usuario

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

Si la aplicación cliente está diseñada para interactuar con todos los elementos del escritorio, incluida su propia interfaz de usuario, debe realizar todas las llamadas a Automatización de interfaz de usuario desde un subproceso independiente. Esto incluye la ubicación de elementos, por ejemplo mediante el método IUIAutomationTreeWalker o IUIAutomationElement::FindAll, y el uso de patrones de control. Este subproceso no debe ser propietario de ninguna ventana, y debe ser un subproceso del modelo de contenedor multiproceso (MTA) de Modelo de objetos componentes (COM) (uno que inicialice COM llamando a CoInitializeEx con la marca COINIT_MULTITHREADED).

Es seguro realizar llamadas a Automatización de la interfaz de usuario dentro de un controlador de eventos de Automatización de la interfaz de usuario, porque siempre se llama al controlador de eventos en un subproceso no 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 a un método relacionado, en un subproceso que no sea de la 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 de Automatización de la interfaz de usuario no debe usar varios subprocesos para agregar o quitar controladores de eventos. El comportamiento inesperado se puede producir 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 de Automatización de la interfaz de usuario debe usar el modelo de subprocesos MTA COM para subprocesos que implementan controladores de eventos. El uso del modelo de contenedor uniproceso (STA) puede provocar problemas como impedir que los clientes quiten controladores de eventos del subproceso.

Afinidad de contenedor 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 contenedor donde se llama a la función CoCreateInstance para crear el objeto. Cuando se cierra el contenedor original, también se libera el objeto remoto.

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

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

Conceptual:

Obtener elementos de UI Automation

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

Información general sobre eventos de UI Automation

Otros recursos:

Descripciones y funcionamiento de modelos de subprocesos OLE