Найти - Пользователи
Полная версия: PyQT и многопоточность
Начало » GUI » PyQT и многопоточность
1 2 3 4 5 6 7
Rudium
py.user.next
Каким образом? Ты пишешь на C++?
py.user.next
Rudium
Ты пишешь на C++?
Ну да, я просто писал сканер на питоне и закончилось всё вот так, что на кнопку нажимаешь а она не мгновенно действует, а с задержкой. Вместо того, чтобы сигналы убирать лишние и думать, как бы это оптимизировать, я просто на C++ перешёл.
Rudium
А сколько сигналов было создано?
py.user.next
Там дело было не столько в количестве, сколько во времени. Когда посылаешь сигналы долгое время, они там накапливаются где-то и начинает тормозить всё. Возможно, дело в сборке мусора, так как эти сигналы являются объектами. Типа для передачи строки в сигнале нужно создать объект, в него поместить строку и потом передать его, а в нём уже там все данные про него. В C++ это не только быстрее всё делается, но и чистится всё сразу. А в питоне, походу, он пока переберёт всё, чтобы определить, что удалять, а что не удалять, вот время и уходит. И когда их десятки или сотни, это сказывается. В то же время в Qt всё принято через сигналы передавать внутри программы.

Ну, короче, выглядит это так: запускаешь программу - всё работает нормально; сидишь в программе полчаса - все кнопки начинают медленно нажиматься и отжиматься.
Rodegast
> Топикстартер указывал в вопросе что изучает PyQt5. PyQt4 = оффтоп

Если говорить только про виджеты, то большой разницы между PyQt5 и PyQt4 не наблюдается.

> Я пользуюсь обычной Qt, PyQt тормозит на сигналах сильно, когда их много становится.
> Ну, короче, выглядит это так: запускаешь программу - всё работает нормально; сидишь в программе полчаса - все кнопки начинают медленно нажиматься и отжиматься.

Ничего подобного не замечал. Какая версия PyQt-а?

> Типа для передачи строки в сигнале нужно создать объект, в него поместить строку и потом передать его

Ссылку надо сигналом передавать, а не строку.
py.user.next
Rodegast
Ничего подобного не замечал. Какая версия PyQt-а?
PyQt4, это от версии не зависит, тут дело в питоне.
А сколько ты сигналов делал? Сделай кнопку, которая при нажатии посылает сотню сигналов, свяжи их с каким-нибудь текстовым полем, да понажимай.

Rodegast
Ссылку надо сигналом передавать, а не строку.
В питоне какие ссылки? При каждой передаче всё заново создаётся и передаётся, а потом висит, пока сборщик мусора не найдёт.
Rudium
Периодическое выполнение кода:
 print(gc.get_count())
который возвращает кортеж (count0, count1, count2) с текущим количеством объектов в каждом поколении, позволяет видеть количество объектов в памяти.
Мне не удалось увеличить количество объектов в памяти при многократном нажатии на кнопку, при котором запускался поток, испускающий сигнал, привязанный к слоту, который выводил данные в GUI
Rodegast
> Сделай кнопку, которая при нажатии посылает сотню сигналов, свяжи их с каким-нибудь текстовым полем, да понажимай.

НА-ХРЕ-НА?

> В питоне какие ссылки? При каждой передаче всё заново создаётся и передаётся, а потом висит, пока сборщик мусора не найдёт.

Вот что имелось в виду:
 def getText():
    return u"ля-ля-ля"*100500
 
# Не правильно
self.emit(QtCore.SIGNAL("superSignal(PyObject)"), getText())
 
# Правильно
text = getText()
self.emit(QtCore.SIGNAL("superSignal(PyObject)"), text)
py.user.next
Rudium
Мне не удалось увеличить количество объектов в памяти при многократном нажатии на кнопку, при котором запускался поток, испускающий сигнал
Да один может быстро чиститься, надо увеличить количество просто.

Rodegast
НА-ХРЕ-НА?
На C++ нативно оно будет работать легко, ограничений нет никаких.

Rodegast
Вот что имелось в виду:
Эта строка может ещё закешироваться и передаваться потом одна и та же ссылка.
Генери строки по новой, используй сигнал в новой форме, увеличь количество сигналов и обязательно принимай их в слоте и что-нибудь делай в нём.
Rodegast
> На C++ нативно оно будет работать легко.

Ты вопроса не понял. Нахрена вешать на кнопку 100 сигналов что бы поменять одно текстовое поле?

> Эта строка может ещё закешироваться и передаваться потом одна и та же ссылка.

Не может.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB