簡體   English   中英

Python,線程和gobject

[英]Python, thread and gobject

我正在使用pygtk通過框架編寫程序。 主程序做了以下事情:

  1. 創建一個監視程序線程來監視某些資源
  2. 創建一個客戶端以從套接字接收數據
  3. call 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()

程序只輸出“Watchdog running ...輸入mainloop ..”,然后什么都沒有。 進入mainloop后似乎線程永遠不會運行。

你能發一些代碼嗎? 可能是您遇到Global Interpreter Lock問題

別人解決了你的問題:) 我可以在這里復制粘貼文章,但簡而言之,gtk的c-threads與Python線程沖突。 你需要通過調用gobject.threads_init()來禁用c線程,所有都應該沒問題

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

使用PyGTK線程時必須記住兩件事:

  1. 必須使用gtk.gdk.threads_init初始化GTK線程:

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

你可以認為glib / gobject而不是pygtk,它是一樣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM