2017-07-30 300 views
5

如果我創建一個線程,它所做的只是連接到某個進程並獲取其頂部窗口,則該程序將掛起。使用pywinauto.top_window()掛起與線程一起使用

我調試了一下,它似乎卡在comtypes._compointer_base.from_params。這是整個回溯:

... 
-> self.top_win = self.app.top_window() 
    c:\python27\lib\site-packages\pywinauto\application.py(1095)top_window() 
-> backend=self.backend.name) 
    c:\python27\lib\site-packages\pywinauto\findwindows.py(197)find_elements() 
-> cache_enable=True) 
    c:\python27\lib\site-packages\pywinauto\uia_element_info.py(272)children() 
-> return self._get_elements(IUIA().tree_scope["children"], cond, cache_enable) 
    c:\python27\lib\site-packages\pywinauto\uia_element_info.py(261)_get_elements() 
-> ptrs_array = self._element.FindAll(tree_scope, cond) 
> c:\python27\lib\site-packages\comtypes\__init__.py(970)from_param() 
-> return value 

鍵入PDB步驟之後,它顯示了這一點,然後凍結:

(Pdb) s 
--Return-- 
> c:\python27\lib\site-packages\comtypes\__init__.py(970)from_param()-><POINTER... 41308a0> 
-> return value 

看來這個問題是在使用comtypes與線程,席力圖召pythoncom.CoInitialize()在調用線程(也在主)但它沒有幫助。

這裏可以做些什麼?

謝謝。

+1

嗯......好問題。也許在MS UI Automation中也有一些線程陷阱......如果你能找到答案,它可能會有用兩次,因爲我們打算爲未來的「記錄 - 重放」實現做一些線程。 –

+1

我還懷疑另一件事是pywinauto只創建一個'IUIA()'對象(是的,它是單例)。我知道這是一種反模式,但我將它作爲解決另一個問題的解決方法,可能無法解決問題。 :)我會考慮如何讓'IUIA()'實例化每個線程一次或允許不受限制的數量的實例... –

+1

[問題#394](https://github.com/pywinauto/pywinauto/issues/394)是對我們的提醒。 –

回答

1

pywinauto==0.6.4默認情況下對COM對象使用多線程模式(MTA)。只需升級pip install -U pywinauto並檢查它是否適用於您。