Модераторы: pythonwin, Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PyQt: QThread: утечка памяти 
:(
    Опции темы
supervasya
Дата 5.8.2014, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.8.2014

Репутация: нет
Всего: нет



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_())


В чём может быть дело?
PM MAIL   Вверх
Google
  Дата 21.10.2019, 20:27 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Разработка GUI | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.