PyGTK 非阻塞
有没有办法在进行一些耗时操作的时候,不让PyGTK卡住?我知道使用线程可以解决这个问题,但那样需要写很多代码和进行复杂的设置。
谢谢,
3 个回答
0
尽量避免使用线程,因为它们在PyGTK中表现得不好。有一些替代方案:
- 对于需要从文件描述符读取的输入/网络操作,可以使用 glib.io_add_watch()。
- 把操作放到一个单独的进程中,然后用 glib.spawn_async() 和它进行通信。
Twisted是一个很棒的网络库,它完全是非阻塞的,并且能很好地与PyGTK的主循环结合,建议考虑使用它。
1
在pygtk中,使用线程其实不是个好主意。你可以在你的耗时操作中检查主循环是否有事件发生,让主循环自己处理这些事情:
while my_operation_running:
<my code>
while gtk.events_pending():
gtk.main_iteration()
或者你可以调整你的耗时操作,让它可以一步一步地运行,使用
glib.idle_add(function)
每当主循环没有事情可做的时候,它会调用“function”,你只需要确保这个函数能记录自己的进度,并且每次调用时只执行一步。
3
在PyGTK中设置一个后台线程其实 并没有那么复杂。