【问题标题】:PyQT Application Hangs when UI is Closed当 UI 关闭时 PyQT 应用程序挂起
【发布时间】:2014-07-12 06:34:57
【问题描述】:

我目前在尝试关闭我的应用程序时遇到问题。截至目前,我的应用程序当前生成并运行在 while 循环(while True 循环)中的线程,而我的主线程在 PyQT 中初始化并运行 UI。

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 中关闭应用程序的主窗口时,无法停止在 shell 中生成 python 脚本的命令,即使使用 ctrl-c 也是如此。

处理这种行为的最佳方法是什么?当我关闭我的应用程序时,我还希望生成的线程停止、加入和退出这个过程。我该怎么做?

【问题讨论】:

  • 很可能该线程卡在某个地方。把日志放在那里看看发生了什么
  • @AbhishekBansal 我知道一个事实,它在一个真正的循环上旋转。退出应用程序后有没有办法让它停止?
  • 关闭最后一个窗口时app.exec_() 是否返回?

标签: python multithreading pyqt


【解决方案1】:

根据 Python 标准库,你有两种方法可以杀死你的线程:

  • 要么将其设置为守护进程 (thread.daemaon = True),否则它将在没有任何适当清理的可能性的情况下被杀死
  • 或者您使用Event 之类的信号方法,您可以在线程中的适当位置进行测试

但我认为你应该看看 SO 中这个较旧的(但仍然是现实的......)问题:Is there any way to kill a Thread in Python?

所有这些都假设app.exec_() 在您的主线程中正确返回。

【讨论】:

    【解决方案2】:

    如果您使线程成为守护进程,它将在您退出应用程序后停止。 在启动它之前放置thread.daemon = True(如果你在调用 start 之后这样做,将引发异常)。它应该可以与线程模块中的线程一起正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多