我有一个使用PySide作为GUI的python应用程序。为了保持应用程序的响应速度,我有很多线程。
一些线程是旨在永远工作的守护程序线程,有些也是我们不关心它们是否完成的守护程序线程。应用程序工作正常,响应性还可以,但是问题出在退出代码上。当有一个线程在应用程序退出期间仍在运行时,我收到以下消息:QThread: Destroyed while thread is still running
。该消息不是问题,但是问题在于它导致应用程序退出,退出代码为1,这会破坏CI的构建。
我们不在乎仍在运行的线程,其中一些我们无法通过设置标志来停止。
我们试图通过使用QThread中的terminate()
方法来终止线程,但是它似乎无能为力。当然,我们为该线程执行了setTerminationEnabled(True)
,甚至等待了几秒钟。 QThread: Destroyed while thread is still running
每次都在那里。为了维护对线程的引用,我拥有所有线程的全局列表,这使我可以确保所有线程都已终止,但是终止的线程仍然有isRunning()
返回True
和{{1 }}返回isFinished()
。有时,我尝试尝试False
时得到Fatal Python error: This thread state must be current when releasing
。
以下是重现此行为的示例代码:
terminate()
如果关闭应用程序,脚本将以代码1和import sys
import time
from PySide import QtCore, QtGui
class Thread(QtCore.QThread):
def run(self):
print("start process")
while True:
# in reality there is no while loop, it is just a long running process
# which may not finish before user decides to close the application
print("running")
time.sleep(2)
class Widget(QtGui.QWidget):
def __init__(self, app):
super(Widget, self).__init__()
self.app = app
self.thread = Thread()
self.thread.start()
print("Control is back in main thread.")
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
w = Widget(app)
w.show()
# the line below can be commented-out to see result immediately
sys.exit(app.exec_())
退出。
是否可以告诉QT在没有任何警告的情况下悄悄杀死这种悬空的线程?基本上,我想要标准Python线程中允许的守护程序线程功能。有什么方法可以在QT中复制它吗?在任何文档中都没有提及守护程序线程。