gpt4 book ai didi

sockets - 使用Quickly在python中进行线程化(监听套接字)

转载 作者:行者123 更新时间:2023-12-03 11:53:16 24 4
gpt4 key购买 nike

我正在制作一个使用python监听套接字的应用程序。我已经使用了Quickon by canonical(将glad与gi.repository结合使用来制作gui)。但是无论如何我无法创建线程来监听函数。即使使用线程类和threading.Thread类,我也尝试了许多方法。
我是Quickly的新手,并且完全是线程。
我尝试了Internet的所有内容:-),但找不到任何解决方案。当我使用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)

顺便说一句,无需为我提供缺少评论项目的代码。我可以的我所坚持的是线程问题。

最佳答案

你可以那样简单地做

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方法会在单独的线程中触发您的 Activity 。

关于sockets - 使用Quickly在python中进行线程化(监听套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13701683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com