问题描述:
在主窗口初始化过程中开启新线程socket,socket线程中又开启子线程与客户端socket通信,关闭主窗口时总是不能退出所有线程(客户端是单独开启一个子进程)。
解决方案:
搜了一下网上的,主要是设置守护进程、重写关闭函数等:
设置守护进程:setDaemon(True),这个方法有效果,语句要写在线程start之前:
self.your_thread = threading.Thread(target=self.fun, args=(arg1, arg2))
# 设置线程为守护线程,防止退出主线程时,子线程仍在运行
self.your_thread.setDaemon(True)
# 新线程启动,注意要先设置守护线程再启动
self.your_thread.start()
重写关闭函数:closeEvent(self, event),这个方法也可行,在函数内用os._exit(0)退出,尝试了sys.exit(0)、sys.exit(app.exec_())代替os._exit(0),发现不可行:
def closeEvent(self, event):
"""
对MainWindow的函数closeEvent进行重构
退出软件时结束所有进程
"""
reply = QtWidgets.QMessageBox.question(self,'提示',"确认退出吗?",QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
event.accept()
#用过sys.exit(0)和sys.exit(app.exec_()),但没起效果
os._exit(0)
else:
event.ignore()
具体原因还没分析,后续可以深入了解一下。