Noções básicas sobre problemas de simultaneidade:

Este tópico descreve cenários comuns de simultaneidade para implementações de cliente de Automação da Interface do Usuário da Microsoft e explica como evitar problemas que podem ocorrer se um cliente usar incorretamente.

Este tópico contém as seguintes seções:

Automação da interface do usuário e thread da interface do usuário

Devido à maneira como Automação da Interface do Usuário usa mensagens do Windows, podem ocorrer conflitos quando um aplicativo cliente tenta interagir com sua própria interface do usuário no thread da interface do usuário. Esses conflitos podem resultar em um desempenho muito lento ou até fazer com que o aplicativo pare de responder.

Se o aplicativo cliente se destina a interagir com todos os elementos na área de trabalho, incluindo sua própria interface do usuário, você deve fazer todas as chamadas de Automação da Interface do Usuário de um thread separadas. Isso inclui localizar elementos (por exemplo, usando IUIAutomationTreeWalker ou o método IUIAutomationElement::FindAll e usando padrões de controle. Esse thread não deve ter nenhuma janela e deve ser de modelo MTA (Multithreaded Apartment) (um que inicializa o COM chamando CoInitializeEx com o sinalizador COINIT_MULTITHREADED ).

É seguro fazer chamadas de Automação da Interface do Usuário em um manipulador de eventos de Automação da Interface do Usuário, pois o manipulador de eventos é sempre chamado em um thread que não é da interface do usuário. No entanto, ao assinar eventos que podem se originar da interface do usuário do aplicativo cliente, você deve fazer a chamada para IUIAutomation::AddAutomationEventHandler ou um método relacionado, em um thread que não seja da interface do usuário (que também deve ser um thread MTA). Remova os manipuladores de eventos no mesmo thread.

Um cliente de automação da interface do usuário não deve usar vários threads para adicionar ou remover manipuladores de eventos. Um comportamento inesperado pode ocorrer se um manipulador de eventos estiver sendo adicionado ou removido enquanto outro estiver sendo adicionado ou removido no mesmo processo do cliente.

Modelo de simultaneidade para manipuladores de eventos

Um cliente de Automação da Interface do Usuário deve usar o modelo de simultaneidade COM MTA para threads que implementam manipuladores de eventos. O uso do modelo STA (Single-threaded Apartment) pode causar problemas como impedir que os clientes removam manipuladores de eventos do thread.

Afinidade de apartamento COM em Windows de 64 bits

De acordo com a especificação COM, o tempo de vida de um objeto remoto é regido pelo tempo de vida do apartamento em que a função CoCreateInstance é chamada para criar o objeto. Quando o apartamento original é desligado, o objeto remoto também é liberado.

Para clientes de Automação da Interface do Usuário, esse comportamento COM pode significar que o tempo de vida do auxiliar remoto 32/64 (criado por UIAutomationCore.dll) usado por um elemento de 32 bits é regido pelo tempo de vida do apartamento do thread que criou o elemento. Se o cliente de Automação da Interface do Usuário transmite o elemento para outro thread, o elemento poderá ser invalidado quando o apartamento de origem for desligado. O cliente de automação da interface do usuário deve lidar com esses problemas normalmente, capturando erros ao usar elementos de automação transmitidos.

O mesmo problema pode ocorrer com um cliente de Automação da Interface do Usuário de 32 bits que tem elementos de 64 bits.

Conceitual:

Obtendo elementos da automação interface do usuário

Assinando eventos de automação da interface do usuário

Visão geral sobre eventos de automação de interface do usuário

Outros recursos:

Descrições e funcionamento de modelos de simultaneidade OLE