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


Основные сведения о проблемах с потоком

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

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

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

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

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

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

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

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

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

Com Apartment Affinity в 64-разрядной версии Windows

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

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

Та же проблема может возникнуть с 32-разрядным клиентом модель автоматизации пользовательского интерфейса с 64-разрядными элементами.

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

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

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

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

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

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