2009-11-25 42 views
6

我正在編寫一個框架使用pygtk的程序。主程序做以下的事情:Python,線程和gobject

  1. 創建一個監視線程來監視一些資源
  2. 創建一個客戶端接收從插座
  3. 呼叫gobject.Mainloop()

數據,但是我的計劃後,似乎進入Mainloop,看門狗線程也不會運行。

我的解決方法是使用gobject.timeout_add來運行顯示器。

但爲什麼創建另一個線程不起作用?

這裏是我的代碼:

import gobject 
import time 
from threading import Thread 

class MonitorThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print "Watchdog running..." 
     time.sleep(10) 

def main(): 

    mainloop = gobject.MainLoop(is_running=True) 

    def quit(): 
     mainloop.quit() 

    def sigterm_cb(): 
     gobject.idle_add(quit) 


    t = MonitorThread() 
    t.start() 

    print "Enter mainloop..." 

    while mainloop.is_running(): 
     try: 
      mainloop.run() 
     except KeyboardInterrupt: 
      quit() 

if __name__ == '__main__': 

    main() 

程序輸出唯一的 「看門狗運行...進入主循環..」,然後什麼。 似乎線程進入主循環後永遠不會運行。

+1

你還期望什麼?有了上面的代碼,我期望這兩件事每次都打印一次。 – u0b34a0f6ae 2009-11-25 15:49:19

回答

9

你能發表一些代碼嗎?可能是因爲Global Interpreter Lock有問題。

Your problem solved by someone else :)。我可以在這裏複製粘貼文章,但總之gtk的c線程與Python線程發生衝突。您需要通過調用gobject.threads_init()來禁用c線程,並且所有應該是都可以。

+0

謝謝,我添加了一些代碼片段,這個代碼有什麼問題嗎? – 2009-11-25 13:13:44

+0

明白了。感謝您的信息。 – 2009-11-25 15:05:32

+2

我很高興你在答案中增加了一個簡短提示,因爲鏈接現在已經死了。 – vidstige 2016-09-01 07:31:38

2

您無法在gtk中初始化基於線程的代碼路徑。

你必須記住兩件事情的時候 使用線程與PyGTK的:

  1. GTK主題必須gtk.gdk.threads_init進行初始化:

http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html,版權完全保留作者。不得刪除此版權聲明。

你可以認爲glib/gobject代替pygtk,它是一樣的東西。

+0

謝謝,我在GTK中退出了新的版本。信息有幫助。 – 2009-11-26 01:50:30