[英]PyQt QThread: Destroyed while thread is still running
Despite saving a reference to the QThread
as self.lightsThread
, stopping the QObject
self.lightsWorker
then starting self.lightsThread
again caused the error 尽管将对
QThread
的引用保存为self.lightsThread
,但是停止QObject
self.lightsWorker
然后再次启动self.lightsThread
导致错误
QThread: Destroyed while thread is still running
After stopping self.lightsWorker
, must the QThread
self.lightsThread
be stopped too? 停止
self.lightsWorker
, QThread
self.lightsThread
必须停止吗? If not, what seems to be the problem? 如果不是,那似乎是什么问题?
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import time
class Screen(QMainWindow):
def __init__(self):
super(Screen, self).__init__()
self.initUI()
def initUI(self):
self.lightsBtn = QPushButton('Turn On')
self.lightsBtn.setCheckable(True)
self.lightsBtn.setStyleSheet("QPushButton:checked {color: white; background-color: green;}")
self.lightsBtn.clicked.connect(self.lightsBtnHandler)
self.setCentralWidget(self.lightsBtn)
def lightsBtnHandler(self):
if self.lightsBtn.isChecked():
self.startLightsThread()
else:
self.stopLightsThread()
def startLightsThread(self):
print 'start lightsThread'
self.lightsThread = QThread()
self.lightsWorker = LightsWorker()
self.lightsWorker.moveToThread(self.lightsThread)
self.lightsThread.started.connect(self.lightsWorker.work)
self.lightsThread.start()
def stopLightsThread(self):
print 'stop lightsThread'
self.lightsWorker.stop()
class LightsWorker(QObject):
signalFinished = pyqtSignal()
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
@pyqtSlot()
def work(self):
while self._running:
print 'working'
time.sleep(1)
self.signalFinished.emit()
@pyqtSlot()
def stop(self):
print 'Stopping'
self._mutex.lock()
self._running = False
self._mutex.unlock()
app = QApplication(sys.argv)
window = Screen()
window.show()
sys.exit(app.exec_())
following the answer https://stackoverflow.com/a/32138213/7742341 after stopping lightWorker
you should to quit from the thread and wait untill it is stopped 停止
lightWorker
你应该退出https://stackoverflow.com/a/32138213/7742341 ,你应该从线程退出并等待直到它停止
def stopLightsThread(self):
print('stop lightsThread')
self.lightsWorker.stop()
self.lightsThread.quit()
self.lightsThread.wait()
I had to face the same issue in C++, but the problem is the same. 我不得不在C ++中遇到同样的问题,但问题是一样的。
The problem is that your QThread instance is deleted while the associated thread is still running. 问题是在关联的线程仍在运行时删除了QThread实例。 This can be really dangerous because the thread code execution is interrupted whitout any guarantee that the thread is ready to be deleted.
这可能非常危险,因为线程代码执行被中断,而且保证线程已准备好被删除。
For example : 例如 :
It lead to a memory leak and a ressource leak. 它导致内存泄漏和资源泄漏。
In your code, the worker is stopped, but not the working thread. 在您的代码中,工作程序已停止,但不是工作线程。 I'm not python expert, but it also seems that your worker object is stopped but not deleted.
我不是python专家,但似乎你的worker对象已经停止但没有被删除。
To properly stop your worker and thread, you should : 要正确停止您的工作者和线程,您应该:
The last step is optionnal : if the thread and worker does not share ressources whith other object, you probably don't need to wait them to finish, just forget about them. 最后一步是optionnal:如果线程和worker没有与其他对象共享资源,你可能不需要等待它们完成,只需忘记它们。
The only execption is that all your thread should be properly stopped before exiting the application : you should wait for all current running threads to stop before application exit. 唯一的例外是在退出应用程序之前应该正确停止所有线程:您应该等待所有当前运行的线程在应用程序退出之前停止。
For simple tasks, you should also consider using QtConcurrent framework. 对于简单的任务,您还应该考虑使用QtConcurrent框架。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.