【发布时间】:2022-03-20 19:33:43
【问题描述】:
这个问题和this one有很大关系,没有解决办法,但又不完全一样。
我想问一下有没有办法在 PyQt 中启动后台任务,并且可以通过按下按钮来kill它。
我的问题是我有一个用户界面和一些需要一段时间来计算的外部(第 3 方)函数。为了在任务计算时不冻结用户界面,我使用QThread 在后台运行它们,并在它们完成时使用signals 同步用户界面。
但是,我想添加外部用户按下按钮并取消当前任务的选项(因为不再需要/不需要该任务)。
在我看来,就像 linux 中的 kill -9 *task* 一样简单,但在 Qt 中很难获得/混淆。
现在我正在使用以下形式的自定义 Qthread:
mythread = Mythread()
mythread.finished.connect(mycallback)
mythread.start()
其中Mythread 继承QThread 覆盖run 方法。
在用户界面中,有一个按钮试图通过以下任一方式终止该线程:
mythread.exit(0)
mythread.quit()
mythread.terminate()
它们都不起作用...我知道文档指出terminate 方法确实有奇怪的行为...
所以问题是..我面对这个问题错了吗?如何杀死一个QThread?如果不可能,有什么替代方法吗?
谢谢!
【问题讨论】:
-
你是在UI类的成员变量中还是在局部变量中保留对线程的引用?
-
@qurban 是的,我愿意。那不是问题。问题是目前
QThread没有查杀机制。 -
请发布最小的工作代码,以便我可以调试它。我总是使用
terminate方法杀死QThread,它总是有效。我不知道为什么这对你的情况不起作用。
标签: python multithreading pyqt kill qthread