Поделиться через


Понимание проблем многопоточности

В этом разделе описываются распространенные сценарии многопоточности для клиентов Microsoft UI Automation и объясняется, как избежать проблем, которые могут возникнуть, если клиент неправильно использует потоки.

Этот раздел состоит из следующих подразделов.

Автоматизация UI и поток пользовательского интерфейса

Из-за того, как модель автоматизации пользовательского интерфейса использует сообщения Windows, конфликты могут возникать, когда клиентское приложение пытается взаимодействовать с собственным пользовательским интерфейсом в потоке пользовательского интерфейса. Эти конфликты могут привести к очень медленной производительности или даже привести к тому, что приложение перестанет отвечать.

Если клиентское приложение предназначено для взаимодействия со всеми элементами на рабочем столе, включая собственный пользовательский интерфейс, необходимо осуществлять все вызовы автоматизации пользовательского интерфейса из отдельного потока. Это включает поиск элементов, например с помощью метода IUIAutomationTreeWalker или метода IUIAutomationElement::FindAll и использования шаблонов элементов управления. Этот поток не должен принадлежать каким-либо окнам и должен быть потоком модели компонента многопоточной среды (MTA), который инициализирует COM путем вызова CoInitializeEx с флагом COINIT_MULTITHREADED.

Безопасно осуществлять вызовы модели автоматизации пользовательского интерфейса в обработчике событий, так как обработчик событий всегда вызывается в отдельном от пользовательского интерфейса потоке. Однако при подписке на события, которые могут возникать из пользовательского интерфейса клиентского приложения, необходимо выполнить вызов IUIAutomation ::AddAutomationEventHandler или связанный метод в потоке, отличном от пользовательского интерфейса (который также должен быть потоком MTA). Удалите обработчики событий в том же потоке.

Клиент системы автоматизации пользовательского интерфейса не должен использовать несколько потоков для добавления или удаления обработчиков событий. Непредвиденное поведение может привести к добавлению или удалению одного обработчика событий при добавлении или удалении другого в одном процессе клиента.

Модель потоков для обработчиков событий

Клиент автоматизации пользовательского интерфейса должен использовать модель потоков COM MTA для потоков, на которых реализованы обработчики событий. Использование модели Single-Threaded Apartment (STA) может привести к проблемам, таким как запрет клиентам удалять обработчики событий из потока выполнения.

Сходство квартир COM в 64-разрядной версии Windows

Согласно спецификации COM, время существования удаленного объекта регулируется временем существования квартиры, в которой вызывается функция CoCreateInstance для создания объекта. Когда исходная квартира завершает работу, удаленный объект также освобождается.

Для клиентов модель автоматизации пользовательского интерфейса это поведение COM может означать, что время существования удаленного вспомогательного средства 32/64 (созданного UIAutomationCore.dll), используемого 32-разрядным элементом, управляется временем существования потока, создавшего элемент. Если клиент автоматизации пользовательского интерфейса маршалирует элемент в другой поток, элемент может стать недействительным при завершении работы исходной среды. Клиент автоматизации пользовательского интерфейса должен корректно обрабатывать эти проблемы, перехватывая ошибки при использовании маршалированных элементов автоматизации.

Та же проблема может возникнуть с 32-разрядным клиентом UI Automation, работающим с 64-разрядными элементами.

Основные понятия.

Получение элементов модели автоматизации пользовательского интерфейса

Подписка на события автоматизации пользовательского интерфейса

Общие сведения о событиях модели автоматизации пользовательского интерфейса

Другие ресурсы:

Описание и работа моделей потоков OLE