Compartilhar via


Noções básicas sobre problemas de threading

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

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

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

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

Se o aplicativo cliente pretende interagir com todos os elementos na área de trabalho, incluindo sua própria interface do usuário, você deve fazer todas as chamadas Automação da Interface do Usuário de um thread separado. 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 janelas e deve ser um thread de modelo do MTA (Component Object Model) Multithreaded Apartment (MTA) (aquele que inicializa COM chamando CoInitializeEx com o sinalizador COINIT_MULTITHREADED ).)

É seguro fazer chamadas Automação da Interface do Usuário em um manipulador de eventos Automação da Interface do Usuário, pois o manipulador de eventos é sempre chamado em um thread que não seja 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 de interface do usuário (que também deve ser um thread MTA). Remova os manipuladores de eventos no mesmo thread.

Um cliente Automação da Interface do Usuário não deve usar vários threads para adicionar ou remover manipuladores de eventos. Um comportamento inesperado poderá resultar se um manipulador de eventos estiver sendo adicionado ou removido enquanto outro estiver sendo adicionado ou removido no mesmo processo de cliente.

Modelo de threading para manipuladores de eventos

Um cliente Automação da Interface do Usuário deve usar o modelo de threading 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 no 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 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 apartment do thread que criou o elemento. Se o cliente Automação da Interface do Usuário realizar marshaling do elemento para outro thread, o elemento poderá ser invalidado quando o apartment de origem for desligado. O cliente Automação da Interface do Usuário deve lidar com esses problemas normalmente capturando erros ao usar elementos de automação marshaled.

O mesmo problema pode ocorrer com um cliente 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

INFO: Descrições e trabalhos de modelos de threading OLE