忽略或静音QThread警告

时间:2019-08-09 07:50:46

标签: python python-3.x multithreading pyside qthread

我有一个使用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中复制它吗?在任何文档中都没有提及守护程序线程。

0 个答案:

没有答案