python 2.7.6 PyQt 4.10.3 Приложение создаёт множество потоков и, конечно, их пытается удалить, но программа всё равно с большой скоростью раздувается в памяти. Упростил программу до следующего вида: Код | # -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui import sys
class MyThread(QtCore.QThread): def __init__(self, parent, n): QtCore.QThread.__init__(self) self.parent_ = parent self.n = n #self.connect(self, QtCore.SIGNAL("finished()"), self, QtCore.SLOT("deleteLater()")) - а если раскоментить - с криками """QThread::wait: Thread tried to wait on itself QThread: Destroyed while thread is still running""" падает
def run(self): print self.n self.emit(QtCore.SIGNAL("signalMyThread(PyQt_PyObject)"), {'result': 'ok', 'n': self.n})
class Application(QtGui.QApplication): def __init__(self, argv): QtGui.QApplication.__init__(self, argv) self.prepare()
def prepare(self): self.threads_ = {} self.working_threads = 0 self.n = -1 for x in xrange(50): QtCore.QTimer().singleShot(100, self.start)
def start(self): self.n += 1 if self.n > 1000000000: QtCore.QTimer().singleShot(100, self.finish) return n = self.n QtCore.QTimer().singleShot(100, lambda: self.start2(n))
def start2(self, n): self.threads_[n] = MyThread(self, n) self.threads_[n].moveToThread(self.threads_[n]) self.connect(self.threads_[n], QtCore.SIGNAL("signalMyThread(PyQt_PyObject)"), self.receive) self.working_threads += 1 self.threads_[n].start()
def receive(self, result): n = result.get('n') QtCore.QTimer().singleShot(100, lambda: self.killThread(n)) QtCore.QTimer().singleShot(100, self.start)
def killThread(self, n): if n not in self.threads_: return if self.threads_[n].isRunning(): QtCore.QTimer().singleShot(100, lambda: self.killThread(n)) return self.threads_[n].deleteLater() self.threads_.pop(n, None) self.working_threads -= 1
def finish(self): if self.working_threads > 0: QtCore.QTimer().singleShot(100, self.finish) return
self.quit()
if __name__=='__main__': app = Application(sys.argv) sys.exit(app.exec_())
|
В чём может быть дело?
|