我有一个服务器应用程序,它通过套接字从同一网络上的其他应用程序接收消息,并不断运行等待消息。它实际上只是一个触发器,这似乎工作正常。
但是我无法关闭该应用程序。当我靠近时,GUI冻结,我无法找到解决方案。以下是服务器代码的相关部分:
class blah blah...
def handler(self, clientsocket, clientaddr):
clientsocket.close()
threading.Thread(target=self.SendFolder).start()
def listen(self):
host = ''
port = 55567
buf = 1024
addr = (host, port)
self.serversocket = socket(AF_INET, SOCK_STREAM)
self.serversocket.bind(addr)
self.serversocket.listen(2)
while 1:
print "Server is listening for connections\n"
clientsocket, clientaddr = self.serversocket.accept()
threading.Thread(target=self.handler, args=(clientsocket, clientaddr)).start()
self.serversocket.close()
def OnClose(self, e):
wx.CallAfter(CloseApp())
class CloseApp(wx.Frame):
def __init__(e):
sys.exit(0)
答案 0 :(得分:1)
如果您不关心在程序退出时清理线程,请考虑将它们标记为"守护程序"线程。
最好清理你的线程(和套接字) - 不知道你的应用程序如何挂在一起,可能会进入OnClose()。例如,可以在任何时候终止self.SendFolder()还是需要完成当前的操作?
答案 1 :(得分:0)
我在启动循环线程时使用self.listenThread.daemon= True
修复了它。
所以现在当我使用我的'关闭'按钮应用程序存在正确,没有冻结。
如果我点击' X'在应用程序的右上角(Windows),应用程序关闭,但线程无法正确退出,无论如何我可以解决这个问题?