Pochopení problémů s vlákny

Toto téma popisuje běžné scénáře podprocesů pro implementace klienta Microsoft UI Automation a vysvětluje, jak se vyhnout problémům, ke kterým může dojít, pokud klient používá nesprávně podprocesy.

Toto téma obsahuje následující části:

Automatizace uživatelského rozhraní a vlákno uživatelského rozhraní

Kvůli způsobu, jakým automatizace uživatelského rozhraní používá zprávy systému Windows, může dojít ke konfliktům, když se klientská aplikace pokusí pracovat s vlastním uživatelským rozhraním ve vlákně uživatelského rozhraní. Tyto konflikty můžou vést k velmi pomalému výkonu nebo dokonce způsobit, že aplikace přestane reagovat.

Pokud má vaše klientská aplikace pracovat se všemi prvky na ploše, včetně vlastního uživatelského rozhraní, měli byste všechna volání automatizace uživatelského rozhraní provádět ze samostatného vlákna. To zahrnuje vyhledání prvků, například pomocí IUIAutomationTreeWalker nebo IUIAutomationElement::FindAll metoda a použití vzorů ovládacích prvků. Toto vlákno by nemělo vlastnit žádná okna a mělo by to být vlákno modelu COM (Component Object Model) Multithreaded Apartment (MTA) (jedno, které inicializuje com voláním CoInitializeEx s příznakem COINIT_MULTITHREADED.)

V obslužné rutině události Automatizace uživatelského rozhraní je bezpečné provádět volání automatizace uživatelského rozhraní, protože obslužná rutina události se vždy volá ve vlákně bez uživatelského rozhraní. Pokud se však přihlašujete k odběru událostí, které mohou pocházet z uživatelského rozhraní klientské aplikace, musíte provést volání IUIAutomation::AddAutomationEventHandlernebo související metodu ve vlákně bez uživatelského rozhraní (což by také mělo být vlákno MTA). Odeberte obslužné rutiny událostí ve stejném vlákně.

Klient automatizace uživatelského rozhraní by neměl používat více vláken k přidání nebo odebrání obslužných rutin událostí. Neočekávané chování může vést k tomu, že se přidává nebo odebírá jedna obslužná rutina událostí, zatímco se přidává nebo odebírá jiná obslužná rutina ve stejném procesu klienta.

Model vláken pro zpracování obslužných rutin událostí

Klient automatizace uživatelského rozhraní by měl používat model vláken COM MTA pro vlákna, která implementují obslužné rutiny událostí. Použití modelu STA (Single-Threaded Apartment) může způsobit problémy, jako je například zabránění klientům v odebrání obslužných rutin událostí z vlákna.

Přednost apartmánu COM na 64bitovém systému Windows

Podle specifikace MODELU COM se životnost vzdáleného objektu řídí životností bytu, ve kterém je volána funkce CoCreateInstance k vytvoření objektu. Když se původní byt vypne, uvolní se také vzdálený objekt.

U klientů automatizace uživatelského rozhraní může toto chování modelu COM znamenat, že životnost vzdáleného pomocníka 32/64 (vytvořeného UIAutomationCore.dll) používaného 32bitovým prvkem se řídí životností vlákna, které vytvořilo prvek. Pokud klient automatizace uživatelského rozhraní předá prvek do jiného vlákna, může se stát neplatným, když se původní úsek ukončí. Klient automatizace uživatelského rozhraní by měl tyto problémy řádně zpracovat zachycením chyb při používání zařazovaných prvků automatizace.

Stejný problém může nastat u 32bitového klienta automatizace uživatelského rozhraní, který má 64bitové prvky.

Koncepční:

získání prvků automatizace uživatelského rozhraní

přihlášení k odběru událostí automatizace uživatelského rozhraní

Přehled událostí automatizace uživatelského rozhraní

další zdroje:

popisy a práce modelů vláken OLE