Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 用python快速执行线程(套接字侦听)_Sockets_Python 2.7_Python Multithreading_Canonical Quickly - Fatal编程技术网

Sockets 用python快速执行线程(套接字侦听)

Sockets 用python快速执行线程(套接字侦听),sockets,python-2.7,python-multithreading,canonical-quickly,Sockets,Python 2.7,Python Multithreading,Canonical Quickly,我正在用套接字制作一个应用程序,用python进行监听。我已经用canonical(它使用glade和gi.repository来制作gui)快速使用了它。但我无论如何都不能创建线程监听函数。我已经尝试了很多方法,甚至包括线程类和线程。线程类。 我不太熟悉快速和全面的线程。 我尝试了互联网上的一切:-)但找不到任何解决方案。当我使用thread.start()时,它会等待gui关闭。当我使用thread.run()时,它会退出gui并立即运行使gui没有响应的函数。下面是我用于thread类的示

我正在用套接字制作一个应用程序,用python进行监听。我已经用canonical(它使用glade和gi.repository来制作gui)快速使用了它。但我无论如何都不能创建线程监听函数。我已经尝试了很多方法,甚至包括线程类和线程。线程类。 我不太熟悉快速和全面的线程。 我尝试了互联网上的一切:-)但找不到任何解决方案。当我使用thread.start()时,它会等待gui关闭。当我使用thread.run()时,它会退出gui并立即运行使gui没有响应的函数。下面是我用于thread类的示例代码。我可以上传整个文件,如果需要,因为这是一个开源项目。请帮帮我

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)

顺便说一句,不需要为注释项提供缺少的代码。我能做到。我遇到的是线程问题。

你可以很容易地做到这一点

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
方法-它只调用您在当前调用它的线程中指定的函数。调用
start
方法
thread
对象在单独的线程中激发您的活动。

我在这里找到了解决方案。 必须在开头加上这两行
从gi.repository导入GObject,Gtk
GObject.threads_init()


无论如何,非常感谢IRC频道的迈克尔·霍尔为我指出了这个问题。

谢谢你的回答。但问题依然存在。函数“listen”仅在GUI关闭时执行。但与非执事线程不同,这会在一段时间后停止。但是我希望两个线程同时执行。你能描述一下你的程序到底是做什么的吗?这听起来很让我惊讶,它不起作用。即使是您提供的代码也应该可以工作(但我认为您应该将作为线程入口点传递的函数更改为其入站版本-
thread.start\u new\u thread(ClassName.listen,(self),)
您提供的代码没有问题。它实际上是“快速”中的一个循环孔。它使用gi.builder对象从glade文件加载gui。第二个线程在调用gui之前不会启动。我想线程应该在加载gui时被调用和初始化。但它是一个单独的类,不能从那里调用它。