Форум сайта python.su
py.user.nextКаким образом? Ты пишешь на C++?
Офлайн
RudiumНу да, я просто писал сканер на питоне и закончилось всё вот так, что на кнопку нажимаешь а она не мгновенно действует, а с задержкой. Вместо того, чтобы сигналы убирать лишние и думать, как бы это оптимизировать, я просто на C++ перешёл.
Ты пишешь на C++?
Отредактировано py.user.next (Июнь 1, 2017 01:52:09)
Офлайн
А сколько сигналов было создано?
Офлайн
Там дело было не столько в количестве, сколько во времени. Когда посылаешь сигналы долгое время, они там накапливаются где-то и начинает тормозить всё. Возможно, дело в сборке мусора, так как эти сигналы являются объектами. Типа для передачи строки в сигнале нужно создать объект, в него поместить строку и потом передать его, а в нём уже там все данные про него. В C++ это не только быстрее всё делается, но и чистится всё сразу. А в питоне, походу, он пока переберёт всё, чтобы определить, что удалять, а что не удалять, вот время и уходит. И когда их десятки или сотни, это сказывается. В то же время в Qt всё принято через сигналы передавать внутри программы.
Ну, короче, выглядит это так: запускаешь программу - всё работает нормально; сидишь в программе полчаса - все кнопки начинают медленно нажиматься и отжиматься.
Офлайн
> Топикстартер указывал в вопросе что изучает PyQt5. PyQt4 = оффтоп
Если говорить только про виджеты, то большой разницы между PyQt5 и PyQt4 не наблюдается.
> Я пользуюсь обычной Qt, PyQt тормозит на сигналах сильно, когда их много становится.
> Ну, короче, выглядит это так: запускаешь программу - всё работает нормально; сидишь в программе полчаса - все кнопки начинают медленно нажиматься и отжиматься.
Ничего подобного не замечал. Какая версия PyQt-а?
> Типа для передачи строки в сигнале нужно создать объект, в него поместить строку и потом передать его
Ссылку надо сигналом передавать, а не строку.
Офлайн
RodegastPyQt4, это от версии не зависит, тут дело в питоне.
Ничего подобного не замечал. Какая версия PyQt-а?
RodegastВ питоне какие ссылки? При каждой передаче всё заново создаётся и передаётся, а потом висит, пока сборщик мусора не найдёт.
Ссылку надо сигналом передавать, а не строку.
Отредактировано py.user.next (Июнь 1, 2017 11:01:44)
Офлайн
Периодическое выполнение кода:
print(gc.get_count())
Отредактировано Rudium (Июнь 1, 2017 11:08:56)
Офлайн
> Сделай кнопку, которая при нажатии посылает сотню сигналов, свяжи их с каким-нибудь текстовым полем, да понажимай.
НА-ХРЕ-НА?
> В питоне какие ссылки? При каждой передаче всё заново создаётся и передаётся, а потом висит, пока сборщик мусора не найдёт.
Вот что имелось в виду:
def getText(): return u"ля-ля-ля"*100500 # Не правильно self.emit(QtCore.SIGNAL("superSignal(PyObject)"), getText()) # Правильно text = getText() self.emit(QtCore.SIGNAL("superSignal(PyObject)"), text)
Офлайн
RudiumДа один может быстро чиститься, надо увеличить количество просто.
Мне не удалось увеличить количество объектов в памяти при многократном нажатии на кнопку, при котором запускался поток, испускающий сигнал
RodegastНа C++ нативно оно будет работать легко, ограничений нет никаких.
НА-ХРЕ-НА?
RodegastЭта строка может ещё закешироваться и передаваться потом одна и та же ссылка.
Вот что имелось в виду:
Отредактировано py.user.next (Июнь 1, 2017 12:29:41)
Офлайн
> На C++ нативно оно будет работать легко.
Ты вопроса не понял. Нахрена вешать на кнопку 100 сигналов что бы поменять одно текстовое поле?
> Эта строка может ещё закешироваться и передаваться потом одна и та же ссылка.
Не может.
Отредактировано Rodegast (Июнь 1, 2017 12:52:15)
Офлайн