2011-09-15 68 views
2

有没有办法阻止PyGTK,而执行一些昂贵的操作?我知道线程可以工作,但需要很多代码和设置。PyGTK非阻塞

感谢,

+0

在昂贵的操作中手动调用事件循环?不幸的是,我不记得确切的函数名称,你不得不修改代码以用于昂贵的操作,并且我读了某处不推荐它。 –

+0

我认为这可能取决于昂贵的操作是什么(你可以重新编码它?)。我使用'while gtk.events_pending()'方法,任何时候我有一个昂贵的操作,除了文件操作,在这种情况下我使用Gio的'* _async()'方法。 –

回答

1

线程在pygtk中并不是一个好的选择。如果这样做的检查在您昂贵的循环活动主循环,并让它做它的事:

while my_operation_running: 

    <my code> 

    while gtk.events_pending(): 
     gtk.main_iteration() 

或调整你的昂贵的操作,因此可以使用运行一步一步

glib.idle_add(function) 

每次主循环都没有事情做,它会调用“函数”,只是确保函数跟踪它的进度,并且每次调用只进行一次迭代。

0

避免线程,它们在PyGTK中不能很好地工作。一些备选方案:

  • 对于您从一个文件描述符读取IO /网络操作,使用 glib.io_add_watch()
  • 移动操作过程,并且 使用glib.spawn_async与它通信()

Twisted是一个很好的网络库,它完全无阻塞,并且与PyGTK主循环集成得很好,可以考虑使用它。