PyQT应用程序在关闭UI时冻结

1 投票
2 回答
845 浏览
提问于 2025-04-18 07:21

我现在在关闭我的应用程序时遇到了一些麻烦。目前,我的应用程序会创建一个线程,这个线程在一个循环里不停地运行(也就是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_()在你的主线程中能够正常返回。

撰写回答