Rudium
Май 31, 2017 22:37:14
py.user.next
Каким образом? Ты пишешь на C++?
py.user.next
Июнь 1, 2017 01:49:25
Rudium
Ты пишешь на C++?
Ну да, я просто писал сканер на питоне и закончилось всё вот так, что на кнопку нажимаешь а она не мгновенно действует, а с задержкой. Вместо того, чтобы сигналы убирать лишние и думать, как бы это оптимизировать, я просто на C++ перешёл.
Rudium
Июнь 1, 2017 07:40:13
А сколько сигналов было создано?
py.user.next
Июнь 1, 2017 09:44:45
Там дело было не столько в количестве, сколько во времени. Когда посылаешь сигналы долгое время, они там накапливаются где-то и начинает тормозить всё. Возможно, дело в сборке мусора, так как эти сигналы являются объектами. Типа для передачи строки в сигнале нужно создать объект, в него поместить строку и потом передать его, а в нём уже там все данные про него. В C++ это не только быстрее всё делается, но и чистится всё сразу. А в питоне, походу, он пока переберёт всё, чтобы определить, что удалять, а что не удалять, вот время и уходит. И когда их десятки или сотни, это сказывается. В то же время в Qt всё принято через сигналы передавать внутри программы.
Ну, короче, выглядит это так: запускаешь программу - всё работает нормально; сидишь в программе полчаса - все кнопки начинают медленно нажиматься и отжиматься.
Rodegast
Июнь 1, 2017 10:46:59
> Топикстартер указывал в вопросе что изучает PyQt5. PyQt4 = оффтоп
Если говорить только про виджеты, то большой разницы между PyQt5 и PyQt4 не наблюдается.
> Я пользуюсь обычной Qt, PyQt тормозит на сигналах сильно, когда их много становится.
> Ну, короче, выглядит это так: запускаешь программу - всё работает нормально; сидишь в программе полчаса - все кнопки начинают медленно нажиматься и отжиматься.
Ничего подобного не замечал. Какая версия PyQt-а?
> Типа для передачи строки в сигнале нужно создать объект, в него поместить строку и потом передать его
Ссылку надо сигналом передавать, а не строку.
py.user.next
Июнь 1, 2017 11:01:17
Rodegast
Ничего подобного не замечал. Какая версия PyQt-а?
PyQt4, это от версии не зависит, тут дело в питоне.
А сколько ты сигналов делал? Сделай кнопку, которая при нажатии посылает сотню сигналов, свяжи их с каким-нибудь текстовым полем, да понажимай.
Rodegast
Ссылку надо сигналом передавать, а не строку.
В питоне какие ссылки? При каждой передаче всё заново создаётся и передаётся, а потом висит, пока сборщик мусора не найдёт.
Rudium
Июнь 1, 2017 11:04:46
Периодическое выполнение кода:
который возвращает кортеж (count0, count1, count2) с текущим количеством объектов в каждом поколении, позволяет видеть количество объектов в памяти.
Мне не удалось увеличить количество объектов в памяти при многократном нажатии на кнопку, при котором запускался поток, испускающий сигнал, привязанный к слоту, который выводил данные в GUI
Rodegast
Июнь 1, 2017 11:09:36
> Сделай кнопку, которая при нажатии посылает сотню сигналов, свяжи их с каким-нибудь текстовым полем, да понажимай.
НА-ХРЕ-НА?> В питоне какие ссылки? При каждой передаче всё заново создаётся и передаётся, а потом висит, пока сборщик мусора не найдёт.
Вот что имелось в виду:
def getText():
return u"ля-ля-ля"*100500
# Не правильно
self.emit(QtCore.SIGNAL("superSignal(PyObject)"), getText())
# Правильно
text = getText()
self.emit(QtCore.SIGNAL("superSignal(PyObject)"), text)
py.user.next
Июнь 1, 2017 12:27:38
Rudium
Мне не удалось увеличить количество объектов в памяти при многократном нажатии на кнопку, при котором запускался поток, испускающий сигнал
Да один может быстро чиститься, надо увеличить количество просто.
Rodegast
НА-ХРЕ-НА?
На C++ нативно оно будет работать легко, ограничений нет никаких.
Rodegast
Вот что имелось в виду:
Эта строка может ещё закешироваться и передаваться потом одна и та же ссылка.
Генери строки по новой, используй сигнал в новой форме, увеличь количество сигналов и обязательно принимай их в слоте и что-нибудь делай в нём.
Rodegast
Июнь 1, 2017 12:33:06
> На C++ нативно оно будет работать легко.
Ты вопроса не понял. Нахрена вешать на кнопку 100 сигналов что бы поменять одно текстовое поле?
> Эта строка может ещё закешироваться и передаваться потом одна и та же ссылка.
Не может.