Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2017 22:37:14

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQT и многопоточность

py.user.next
Каким образом? Ты пишешь на C++?

Офлайн

#2 Июнь 1, 2017 01:49:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQT и многопоточность

Rudium
Ты пишешь на C++?
Ну да, я просто писал сканер на питоне и закончилось всё вот так, что на кнопку нажимаешь а она не мгновенно действует, а с задержкой. Вместо того, чтобы сигналы убирать лишние и думать, как бы это оптимизировать, я просто на C++ перешёл.



Отредактировано py.user.next (Июнь 1, 2017 01:52:09)

Офлайн

#3 Июнь 1, 2017 07:40:13

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQT и многопоточность

А сколько сигналов было создано?

Офлайн

#4 Июнь 1, 2017 09:44:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQT и многопоточность

Там дело было не столько в количестве, сколько во времени. Когда посылаешь сигналы долгое время, они там накапливаются где-то и начинает тормозить всё. Возможно, дело в сборке мусора, так как эти сигналы являются объектами. Типа для передачи строки в сигнале нужно создать объект, в него поместить строку и потом передать его, а в нём уже там все данные про него. В C++ это не только быстрее всё делается, но и чистится всё сразу. А в питоне, походу, он пока переберёт всё, чтобы определить, что удалять, а что не удалять, вот время и уходит. И когда их десятки или сотни, это сказывается. В то же время в Qt всё принято через сигналы передавать внутри программы.

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



Офлайн

#5 Июнь 1, 2017 10:46:59

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2749
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQT и многопоточность

> Топикстартер указывал в вопросе что изучает PyQt5. PyQt4 = оффтоп

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

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

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

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

Ссылку надо сигналом передавать, а не строку.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Июнь 1, 2017 11:01:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQT и многопоточность

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

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



Отредактировано py.user.next (Июнь 1, 2017 11:01:44)

Офлайн

#7 Июнь 1, 2017 11:04:46

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQT и многопоточность

Периодическое выполнение кода:

 print(gc.get_count())
который возвращает кортеж (count0, count1, count2) с текущим количеством объектов в каждом поколении, позволяет видеть количество объектов в памяти.
Мне не удалось увеличить количество объектов в памяти при многократном нажатии на кнопку, при котором запускался поток, испускающий сигнал, привязанный к слоту, который выводил данные в GUI

Отредактировано Rudium (Июнь 1, 2017 11:08:56)

Офлайн

#8 Июнь 1, 2017 11:09:36

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2749
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQT и многопоточность

> Сделай кнопку, которая при нажатии посылает сотню сигналов, свяжи их с каким-нибудь текстовым полем, да понажимай.

НА-ХРЕ-НА?

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

Вот что имелось в виду:

 def getText():
    return u"ля-ля-ля"*100500
 
# Не правильно
self.emit(QtCore.SIGNAL("superSignal(PyObject)"), getText())
 
# Правильно
text = getText()
self.emit(QtCore.SIGNAL("superSignal(PyObject)"), text)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Июнь 1, 2017 12:27:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQT и многопоточность

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

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

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



Отредактировано py.user.next (Июнь 1, 2017 12:29:41)

Офлайн

#10 Июнь 1, 2017 12:33:06

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2749
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQT и многопоточность

> На C++ нативно оно будет работать легко.

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

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

Не может.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июнь 1, 2017 12:52:15)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version