Комментарии 4
Полезная статья. Странно, что об этом до сих пор никто не писал.
Когда только начинал работать с PyQt/PySide, а приложения становились всё больше, то постоянно ловил крэши при выходе из приложения из-за описанных в данной статье проблем с корректным удалением объектов и последовательности их удаления. Особенно замучило то, что сигналы, подключенные к lambda-функциям, почему-то корректно не отключались в PySide. В итоге решил для себя вообще отказаться от использования lambda-функций в качестве слотов.
Когда только начинал работать с PyQt/PySide, а приложения становились всё больше, то постоянно ловил крэши при выходе из приложения из-за описанных в данной статье проблем с корректным удалением объектов и последовательности их удаления. Особенно замучило то, что сигналы, подключенные к lambda-функциям, почему-то корректно не отключались в PySide. В итоге решил для себя вообще отказаться от использования lambda-функций в качестве слотов.
+1
Буквально на днях сталкивался с подобным в PyQt.
Была локальная функция, которая вешалась на сигнал из треда для обновления списка в диалоговом окне. Первый же запуск вызвал «изумление» — данные скачиваются, а после закрытия диалога программа молча и без диагностики падает. Всё честно — поюзали диалог и он удалился, а сигналы не отключились ))
Была локальная функция, которая вешалась на сигнал из треда для обновления списка в диалоговом окне. Первый же запуск вызвал «изумление» — данные скачиваются, а после закрытия диалога программа молча и без диагностики падает. Всё честно — поюзали диалог и он удалился, а сигналы не отключились ))
0
1) Многие из таких болячек предотвращаются на ура, если об этом просто помнить всегда.
Кстати, спасибо за статью — наверняка спасет многих от долгих поисков «решения».
2) Взято из PyQt / QObject:
When an object is deleted, it emits a destroyed() signal. You can catch this signal to avoid dangling references to QObjects.
Если все же словил подобное и развести не удается, то что-нибудь вроде этого иногда помогает (иногда в процессе поиска, иногда как решение — например сделать свой isAlive):
3) Некоторые из таких ошибок можно предотвратить повесив на closeEvent окна или aboutToQuit приложения небольшой цикл ожидания (например ждать максимум 1000ms пока очередь, c qt reference в питоне будет пуста и т.д.).
Кстати, спасибо за статью — наверняка спасет многих от долгих поисков «решения».
2) Взято из PyQt / QObject:
When an object is deleted, it emits a destroyed() signal. You can catch this signal to avoid dangling references to QObjects.
Если все же словил подобное и развести не удается, то что-нибудь вроде этого иногда помогает (иногда в процессе поиска, иногда как решение — например сделать свой isAlive):
obj.destroyed[QObject].connect(self.destroyed_slot)
3) Некоторые из таких ошибок можно предотвратить повесив на closeEvent окна или aboutToQuit приложения небольшой цикл ожидания (например ждать максимум 1000ms пока очередь, c qt reference в питоне будет пуста и т.д.).
+1
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
PyQt. Управляем памятью, собираем мусор