Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 05.08.2014
Сообщений: 3

PyQt: QThread: утечка памяти

05.08.2014, 16:03. Показов 3139. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
python 2.7.6
PyQt 4.10.3

Приложение создаёт множество потоков и, конечно, их пытается удалить, но программа всё равно с большой скоростью раздувается в памяти. Упростил программу до следующего вида:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# -*- 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_())
В чём может быть дело?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2014, 16:03
Ответы с готовыми решениями:

PyMuPDF и утечка памяти
Здравствуйте. Нужно написать скрипт-парсер. На определенном этапе скрипта необходимо извлечь изображения из PDF. Нашел на гитхабе...

Работа с потоком; PyQt - QThread
Доброе время суток :). Имею интерфейс + выполняемый тест (selenium). Запуск драйвера вынесен в отдельный поток, дабы интерфейс оставался...

PyQt, открытие файлов из оперативной памяти
В pyQt надо сделать открытие файла, аналогичное ctrl+o. Но открываться должна не заданная существующая директория, а список файлов из...

2
0 / 0 / 1
Регистрация: 05.08.2014
Сообщений: 3
08.08.2014, 14:01  [ТС]
Ну правильно, смотри что ты делаешь:

Python
1
self.threads_[n].moveToThread(self.threads_[n])
Помещаешь поток сам в себя, и ждёшь, что он после этого сможет нормально удалиться. Если с moveToThread делать, то наследуй класс от простого QObject и делай так:
Python
1
2
3
4
5
thread_ = QtCore.QThread()
self.threads_[n].moveToThread(thread_)
self.threads_[n].connect(self, QtCore.SIGNAL("finished()"), thread_.quit)
thread_.connect(self, QtCore.SIGNAL("started()"), self.threads_[n].run)
thread_.start()
Или просто убери moveToThread, перегрузки run у QThread достаточно.
0
08.08.2014, 16:21

Не по теме:

ТС общается сам с собой:scratch: Что-то новое.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2014, 16:21
Помогаю со студенческими работами здесь

Утечка памяти во Flask
Всем доброго дня! Существует несколько терминалов с видеокамерами, которые раз в 60 секунд отправляют на сервер (/get-info) последний...

Разница между PyQT 5 и PyQT 6
Добрый день, форумчане. Прошел тут курс всеми вами любимого автора, познакомился с GUI TKinter, и по вашим советам решил освоить PyQT. ...

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка ссылки с сайта и ищет там определенную...

Вектор, утечка памяти, функция создания и выделение памяти
Здравствуйте. Есть проблема. функция malloc выделяет память лишь в функции CreateVector(), и при выходе из нее указатель теряется. Или не...

QThread::start: Failed to create thread (Недостаточно памяти для обработки команды.)
Ошибка возникает после создания примерно сотни потоков, чеза памяти ему не хватает? у меня оперативки 8 гиг, из них 6 свободно


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru