【发布时间】:2011-08-10 11:25:38
【问题描述】:
我使用 PyGTK 创建了一些应用程序,并认为它们没有问题,直到我在可访问性启用的环境中执行它们(Ubuntu 上的 GNOME 和 Debian 上的 Openbox) .我发现它们挂起,更令人沮丧的是 - 它们导致 AT-SPI 应用程序挂起。
我已经创建了一个 repo,其中包含使用 PyGTK 和我能想到的线程的所有变体:
- primarythread 前缀表示 gtk.main() 在主线程内工作 (首先由 Python 执行),
- secondarythread 前缀表示 gtk.main() 在辅助线程内工作,
multiprocessing前缀表示import和gtk.main()在另一个进程中执行。
gobject后缀表示只使用了gobject.threads_init(),
- gtkgdk后缀表示gobject和gtk.gdk.threads_init()都被使用过,
- import 后缀表示“import gtk”在新线程内执行。
showApps.py 是使用 AT-SPI 列出启用了可访问性的应用程序的示例。
我在下表中总结了测试(也在README 文件中):
"Hang" column indicates if the GTK application has hung.
"Listed" column indicates if the application is visible in the AT-SPI
listing.
| hang | listed |
----------------------------------+----------+--------+
primarythread_gobject.py | no | yes |
primarythread_gtkgdk.py | no | yes |
secondarythread_gobject_import.py | no [1] | yes |
secondarythread_gobject.py | yes | hang |
secondarythread_gtkgdk_import.py | no [1] | yes |
secondarythread_gtkgdk.py | yes | hang |
multiprocessing_gobject.py | no | yes |
[1] ** (secondarythread_gobject_import.py:5828): CRITICAL **:
giop_thread_request_push: assertion `tdata != NULL' failed
-- at the application termination
当 AT-SPI 被标记为“挂起”时,它会在应用程序列表期间无条件挂起。
PyGTK 应用程序的挂起发生在例如在其窗口失去焦点并重新获得焦点之后。
测试表明,当从第一个/主 Python 线程运行 gtk.main() 时没有出现问题。但这并不能让我满意,因为我不喜欢将 GUI 作为应用程序的主要部分。
我的问题是:
- 标记为 secondarythread 的程序中的代码有什么问题吗?还是 GTK/GAIL/AT-SPI 中的错误?
- 是否有禁止在第一个/主 Python 线程之外运行 gtk.main() 的策略?
【问题讨论】:
标签: multithreading gtk accessibility pygtk