【问题标题】:Using pywinauto.top_window() hangs when using it with threads将 pywinauto.top_window() 与线程一起使用时会挂起
【发布时间】:2018-01-06 03:33:15
【问题描述】:

如果我创建一个线程,它所做的只是连接到某个进程并获取它的顶部窗口,那么程序就会挂起。

我对其进行了一点调试,它似乎卡在了 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 中输入 step 后,它会显示这个然后冻结:

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

问题似乎在于使用线程的comtypes,我尝试在调用线程(以及main)中调用pythoncom.CoInitialize(),但没有帮助。 p>

这里可以做什么?

谢谢。

【问题讨论】:

  • 嗯...好问题。也许 MS UI 自动化中的线程也有一些陷阱......如果你能找到答案,它可能会有用两倍,因为我们计划为未来的“记录重放”实现做一些线程。
  • 我怀疑的另一件事是 pywinauto 只创建了一个 IUIA() 对象(是的,它是单例)。我知道这有点反模式,但我把它作为另一个问题的解决方法,这个问题可能无论如何都无法解决。 :) 我会考虑如何让IUIA() 每个线程实例化一次或允许无限数量的实例......
  • Issue #394 是对我们的提醒。
  • 谢谢.. 现在,我做了一个解决方法,使其成为单线程

标签: python multithreading com pywinauto comtypes


【解决方案1】:

pywinauto==0.6.4 默认情况下对 COM 对象使用多线程模式 (MTA)。只需通过pip install -U pywinauto 升级它并检查它是否适合您。

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 2017-01-29
    • 2017-02-26
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多