1

我正在用套接字進行python監聽的應用程序。我已經使用了快速的規範(使用glade和gi.repository來製作gui)。但無論如何我都無法創建線程來監聽函數。我已經嘗試了很多方法,即使使用線程類和線程。線程類。 我是新來的快速和線程完全。 我嘗試了所有在互聯網上:-),但找不到任何解決方案。當我使用thread.start()時,它會等到gui關閉。當我使用thread.run()時,它會退出gui並立即運行讓gui無法響應的函數。以下是我用於線程類的示例代碼。如果需要,我可以上傳整個文件,因爲這是一個開源項目。請幫幫我。在python中快速執行線程(套接字監聽)

def listen(self): 
    print "working" 
#listen to any incoming connections 
    #self.control_sock_in.listen(1) 
    i=0 
    while True: 
     print "it works" 
    #conn,addr = self.control_sock_in.accept() 
    #data = conn.recv 
    #if there is any incoming connection then check for free slot and reply with that free slot 
#if change of status message then update nodelist 

def on_btn_create_n_clicked(self, widget): 
    self.btn_quit_n.set_sensitive(True) 
    self.btn_join_n.set_sensitive(False) 
    self.btn_create_n.set_sensitive(False) 
    subprocess.check_call(["sudo", "ifconfig", "wlan0", "192.168.0.5", "netmask", "255.255.255.0", "broadcast", "192.168.0.255"]) 
    self.control_sock_in = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.control_sock_in.bind(('192.168.0.5', 6000)) 
    self.status_lbl.set_text("Created the network successfully with IP of 192.168.0.5!") 
    self.nodelist['192.168.0.5'] = ('6000','0') 
#start thread on listen() 
    thread.start_new_thread(self.listen,(self,)) 
    self.btn_camera.set_sensitive(True) 
    self.btn_mixer.set_sensitive(True) 
    self.btn_display.set_sensitive(True) 

順便說一句,沒有必要爲我提供缺少代碼的評論項目。我可以做到。我堅持的是線程問題。

回答

0

那麼我在這裏找到了解決方案。 link from askubuntu 必須在開頭添加這兩行 from gi.repository import GObject, Gtk GObject.threads_init()

無論如何,非常感謝邁克爾·霍爾在快速IRC頻道指出我的問題。

1

你可以做這麼簡單作爲

from threading import Thread 
listener_thread = Thread(target=self.listen) 
listener_thread.start() 

當你的程序終止,並有運行某些非守護線程,它會等待,直到他們全部完成。

您可以將您的線程標記爲daemon,但您需要小心他們 - 有關更多詳細信息,請參見this article。基本上,它們可能仍在運行,並且由於其他線程中發生的清理或已經發生的事情而使用處於一致狀態的數據。

創建守護線程:

from threading import Thread 
listener_thread = Thread(target=self.listen) 
listener_thread.daemon = True 
# or listener_thread.setDaemon(True) for old versions of python 
listener_thread.start() 

最好的選擇是離開你的監聽線程非守護(默認),並想辦法以某種方式通知監聽線程,當你的程序即將退出。因此,您的監聽器線程可以優雅地完成。

更新

不要使用線程對象的run方法 - 它只是簡單地調用您在線程當前是從調用它指定的函數。調用start方法Thread對象在單獨的線程中激發您的活動。

+0

感謝您的回答。但問題依然存在。函數'listen'僅在GUI關閉時執行。但是與非deamon線程不同,一段時間後會停止。不過,我希望兩個線程同時執行。 –

+1

您能否介紹一下您的程序的功能?這聽起來很令人驚訝,它不起作用。即使您提供的代碼應該可以工作(但我認爲您應該將函數作爲線程的入口點更改爲入站版本--'thread.start_new_thread(ClassName.listen,(self,))' –

+0

這是沒有問題的你提供的代碼實際上是一個'快速'的循環漏洞,它使用gi.builder對象從glade文件加載gui,第二個線程在調用gui之前不會啓動,我猜應該調用線程並初始化它會加載gui,但它是一個單獨的類,不能從那裏調用它。 –