Can';关闭Python应用程序
我有一个服务器应用程序,它通过套接字接收来自同一网络上其他应用程序的消息,并不断运行以等待消息。这实际上只是一个触发器,它似乎工作得很好 但我无法关闭应用程序。当我点击close时,GUI冻结,我找不到解决方案。以下是服务器代码的相关部分:Can';关闭Python应用程序,python,multithreading,sockets,wxpython,Python,Multithreading,Sockets,Wxpython,我有一个服务器应用程序,它通过套接字接收来自同一网络上其他应用程序的消息,并不断运行以等待消息。这实际上只是一个触发器,它似乎工作得很好 但我无法关闭应用程序。当我点击close时,GUI冻结,我找不到解决方案。以下是服务器代码的相关部分: class blah blah... def handler(self, clientsocket, clientaddr): clientsocket.close() threading.Thread(target
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)
如果您不关心清理程序出口的线程,请考虑将它们标记为“守护进程”线程。
清理线程(和套接字)是一种很好的做法,而不知道应用程序是如何挂接在一起的,这可能会出现在OnClose()中。例如,在任意点终止self.SendFolder()是否可以,或者它是否需要完成其当前操作?我在启动循环线程时使用了
self.listenThread.daemon=True
修复了它。
因此,现在当我使用“关闭”按钮时,应用程序正确存在,没有冻结。
如果我单击应用程序(窗口)右上角的“X”,应用程序将关闭,但线程没有正确退出,无论如何,我可以绕过这个问题?您正在启动线程,但在退出之前没有停止它们!当你需要存在的时候,你必须关闭你启动的所有线程…所以也许你应该考虑一下我的答案。