我正在用python制作一个带有套接字侦听的应用程序。我使用了规范的Quick(使用glade和gi.repository来制作gui)。但无论如何,我都无法创建侦听函数的线程。我已经尝试了很多方法,甚至使用线程类和线程。线程类。我是Quick和threads的新手。我尝试了互联网上的一切:-),但找不到任何解决方案。当我使用thread.start()时,它会等待gui关闭。当我使用thread.run()时,它会退出gui并立即运行使gui没有响应的函数。下面是我用于线程类的示例代码。如果需要的话,我可以上传整个文件,因为这是一个开源项目。请帮帮我。
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)
BTW无需为我提供评论项目的缺失代码。我能做到。我陷入困境的是线程问题。
你可以像一样简单地做到这一点
from threading import Thread
listener_thread = Thread(target=self.listen)
listener_thread.start()
当程序终止并且有一些非守护进程线程正在运行时,它将等待,直到它们全部完成。
您可以将线程标记为守护进程,但需要小心使用它们——有关更多详细信息,请参阅本文。基本上,由于其他线程中正在进行或已经进行的清理,它们可能仍在运行并使用处于一致状态的数据。
创建守护进程线程:
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
方法——它只是调用您在当前调用它的线程中指定的函数调用Thread
对象的start
方法会在单独的线程中激发您的活动。
我在这里找到了解决方案。来自askubuntu的链接开头必须加上这两行from gi.repository import GObject, Gtk
GObject.threads_init()
。
无论如何,非常感谢IRC频道的Michael Hall为我指出了这个问题。