2011-09-15 203 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主循環集成得很好,可以考慮使用它。