PyQT应用程序在关闭UI时冻结
我现在在关闭我的应用程序时遇到了一些麻烦。目前,我的应用程序会创建一个线程,这个线程在一个循环里不停地运行(也就是while True循环),而我的主线程则负责初始化和运行PyQT的用户界面。
def main():
group_size = 8
buffer_size = 4
app = QtGui.QApplication(sys.argv)
dgui = DirectGui(group_size, buffer_size)
engine = KCluster_Engine(group_size, buffer_size)
dgui.set_engine_ref(engine)
engine.assign_interface(dgui)
thread = Thread(target = engine.start)
thread.start()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
当我在PyQT中关闭应用程序的主窗口时,启动这个Python脚本的命令在终端里无法停止,即使我按了ctrl-c也不行。
我该如何处理这种情况呢?我希望在关闭应用程序时,那个创建的线程也能停止、结束并退出这个进程。我该怎么做呢?
2 个回答
1
如果你把线程设置为守护线程,它会在你退出应用程序后自动停止。你需要在启动线程之前设置它为守护线程,方法是把 thread.daemon = True
放在启动之前(如果你在调用启动后再设置,就会出现错误)。这样做在使用线程模块的线程时应该没问题。
2
根据Python标准库,你有两种方法可以结束你的线程:
- 第一种是把它设置为守护线程(
thread.daemon = True
),这样它会被强制结束,但不会有机会进行任何清理工作。 - 第二种是使用一种信号方法,比如
Event
,然后在你的线程中适当的地方进行检查。
不过,我觉得你可以看看这个较早的问题(但现在依然适用):在Python中有没有办法结束一个线程?
所有这些都假设app.exec_()
在你的主线程中能够正常返回。