Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano typowe scenariusze wątkowe implementacji klienta Microsoft UI Automation i wyjaśniono, jak uniknąć problemów, które mogą wystąpić, jeśli klient używa wątków w sposób niepoprawny.
Ten temat zawiera następujące sekcje:
- automatyzacja interfejsu użytkownika i wątku interfejsu użytkownika
- model wątków dla programów obsługi zdarzeń
- Powiązanie COM w 64-bitowym systemie Windows
- Tematy pokrewne
Automatyzacja interfejsu użytkownika i wątek interfejsu użytkownika
Ze względu na sposób, w jaki automatyzacja interfejsu użytkownika korzysta z komunikatów systemu Windows, konflikty mogą wystąpić, gdy aplikacja kliencka próbuje wchodzić w interakcję z własnym interfejsem użytkownika w wątku interfejsu użytkownika. Te konflikty mogą prowadzić do bardzo niskiej wydajności, a nawet spowodować, że aplikacja przestanie odpowiadać.
Jeśli aplikacja kliencka ma na celu interakcję ze wszystkimi elementami na pulpicie, w tym z własnym interfejsem użytkownika, należy wykonać wszystkie wywołania automatyzacji interfejsu użytkownika z oddzielnego wątku. Obejmuje to na przykład lokalizowanie elementów przy użyciu IUIAutomationTreeWalker lub IUIAutomationElement::FindAll metody i używania wzorców kontrolek. Ten wątek nie powinien być właścicielem okien i powinien być wątkiem wielowątkowym modelu COM (COM Multithreaded Apartment, MTA), który inicjuje COM, wywołując CoInitializeEx z flagą COINIT_MULTITHREADED.
Można bezpiecznie wykonywać wywołania automatyzacji interfejsu użytkownika w procedurze obsługi zdarzeń automatyzacji interfejsu użytkownika, ponieważ procedura obsługi zdarzeń jest zawsze wywoływana w wątku innym niż interfejs użytkownika. Jednak w przypadku subskrybowania zdarzeń, które mogą pochodzić z interfejsu użytkownika aplikacji klienckiej, należy wykonać wywołanie metody IUIAutomation::AddAutomationEventHandlerlub powiązanej metody w wątku, który nie jest wątkiem interfejsu użytkownika (który powinien być również wątkiem MTA). Usuń programy obsługi zdarzeń w tym samym wątku.
Klient automatyzacji interfejsu użytkownika nie powinien używać wielu wątków do dodawania ani usuwania procedur obsługi zdarzeń. Nieoczekiwane zachowanie może spowodować, że jedna procedura obsługi zdarzeń jest dodawana lub usuwana podczas dodawania lub usuwania innego w tym samym procesie klienta.
Model wątków dla programów obsługi zdarzeń
Klient automatyzacji interfejsu użytkownika powinien używać modelu wątkowania COM MTA dla wątków implementujących programy obsługi zdarzeń. Korzystanie z modelu Apartament jednowątkowy (STA) może powodować problemy, takie jak zapobieganie usuwaniu programów obsługi zdarzeń z wątku przez klientów.
Powiązanie obiektów COM w 64-bitowym systemie Windows
Zgodnie ze specyfikacją COM okres istnienia obiektu zdalnego podlega okresowi istnienia mieszkania, w którym funkcja CoCreateInstance jest wywoływana w celu utworzenia obiektu. Po zamknięciu oryginalnego mieszkania obiekt zdalny jest również zwalniany.
W przypadku klientów automatyzacji interfejsu użytkownika to zachowanie modelu COM może oznaczać, że okres istnienia zdalnego pomocnika 32/64 (utworzony przez UIAutomationCore.dll) używany przez element 32-bitowy podlega okresowi istnienia mieszkania wątku, który utworzył element. Jeśli klient automatyzacji interfejsu użytkownika marshaluje element do innego wątku, element może zostać unieważniony po zamknięciu mieszkania źródłowego. Klient automatyzacji interfejsu użytkownika powinien łagodnie obsługiwać te problemy, przechwytując błędy podczas korzystania z elementów automatyzacji przesyłanych przez proces.
Ten sam problem może wystąpić w przypadku 32-bitowego klienta automatyzacji interfejsu użytkownika, który ma 64-bitowe elementy.
Tematy pokrewne
Koncepcja:
Pozyskiwanie Elementów Automatyzacji Interfejsu Użytkownika
Subskrybowanie zdarzeń automatyzacji interfejsu użytkownika
Omówienie zdarzeń automatyzacji interfejsu użytkownika
inne zasoby: