Найти - Пользователи
Полная версия: PyQT и многопоточность
Начало » GUI » PyQT и многопоточность
1 2 3 4 5 6 7
py.user.next
Rudium
Разумеется я не представляю, какую сложность ты создал в своей программе.
Для тебя проблема - сделать сотню независимых друг от друга точек. Всё у тебя куда-то связано-завязано. Это далеко не всегда так.

Rudium
Чтобы нарисовать сто точек по клику, нужно создать один сигнал
С чего ты взял, что они должны перерисовываться одновременно? Видишь, ты мыслишь однопоточно. Этот сигнал может прийти от кнопки, а может прийти откуда-то ещё, и точка должна среагировать на оба, каждый раз получая такой сигнал. Там может таймер такой сигнал посылать.

Один сигнал, это когда у тебя в программе нет ничего, там подойдёт один сигнал. Но в том-то и дело, что учебные программки - это как раз программки, в которых нет ничего, потому что они никаких задач не решают. Когда тебе реальную программу надо написать, для решения задачи надо много всяких ресурсов задействовать. И если есть требование “отрисовать точки независимо”, то их и надо так отрисовать, а не подгонять программу по свои возможности. Подгоняешь - получишь вообще не то. Программа просто тебя в тупик заведёт, потому что удобно будет её дописать только до определённого момента.
Rodegast
> Это к TDD никак не относится.

Ну вообще-то это был сарказм.

> Чтобы что-то передать, надо объект создать … в отложенном режиме.

Имелось в виду, то что размер объекта имеет значение.

> Какой один сигнал? Каждая точка зависит от своего собственного объекта, который ей сигнал посылает в любой момент

Да у кнопки должен быть один сигнал и один слот. И уже в слоте должна происходить перерисовка твоих точек. Если у тебя как-то по другому, то тебя по рукам бить надо.
Rudium
py.user.next
Спасибо за мем! Теперь я буду любого человека, не знающего требований к программе, называть “Человек с однопоточным мышлением”)))
И вопрос, почему ты не увидел замедления работы программы, когда представил как она работает до того, как написал ее? Ты ведь можешь обойтись без всех этих UML, кодирования и другой фигни для новичков?
И еще один вопрос: сколько нужно потоков мышления, чтобы представить как работает система управления космическим кораблем “Буран”, не приступая к ее проектированию?
P.S Спасибо за хорошее настроение, надеюсь что ты не перейдешь полностью на C++ и не покинешь нас.
py.user.next
Rudium
И вопрос, почему ты не увидел замедления работы программы, когда представил как она работает до того, как написал ее?
Потому что на питоне это оказалось не так, как на C++. Неужели ты думаешь, что если там называется Qt и здесь называется PyQt - то оно реализовано одинаково?

Rudium
Ты ведь можешь обойтись без всех этих UML, кодирования и другой фигни для новичков?
Раньше не было UML, ты думаешь, из-за этого не писали программ каких-либо? Были блок-схемы обычные, это всё рисовалось на миллиметровке.

Rudium
И еще один вопрос: сколько нужно потоков мышления, чтобы представить как работает система управления космическим кораблем “Буран”, не приступая к ее проектированию?
А проектирование, по-твоему, из космоса берётся? Сначала человек представляет часть, потом рисует её. Но даже это не значит, что он не может представить все части без их зарисовки. Просто делают зарисовку, чтобы потом не представлять всё повторно. Когда оно нарисовано, голова свободна для новых представлений. Если же у тебя не нарисовано, то ты должен каждый раз всё это воспроизводить. И проблема даже не в этом, а в том, что ни о чём другом ты подумать не можешь, так как сознание занято этой информацией.

Ты говоришь “я не представляю, как это, иметь сотню независимых асинхронных точек”. Потому и не представляешь, что никогда одновременно ничего не опрашивал. Значит, пока на таком уровне, типа “здравствуй лошадь первого разбойника, здравствуй первый разбойник, здравствуй лошадь второго разбойника, здравствуй второй разбойник…” и так далее. Нафиг мне таким заниматься? Я уже этот этап прошёл давно.

Rodegast
Да у кнопки должен быть один сигнал и один слот.
Это ты с чего взял, что у кнопки должен быть слот? Кнопка посылает сигнал, дальше кто этот сигнал принимает, она не знает.

Вот тебе пример (скопируешь в консоль)
import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QMainWindow):
closeApp = QtCore.pyqtSignal()
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.closeApp.connect(self.close)
self.closeApp.connect(self.print_message)
self.setGeometry(300, 300, 290, 150)
self.setWindowTitle('Emit signal')
self.show()
def mousePressEvent(self, event):
self.closeApp.emit()
def print_message(self):
print('message')

def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

main()

Здесь сигнал соединён с двумя слотами. Где он соединяется или разъединяется, этот объект, который его посылает, может знать, а может и не знать. Если мы этот сигнал не внутри создадим, а просто снаружи доставим, уже настроенный, то окно будет знать только, что его можно послать. Сейчас я этот сигнал поставил для общения, через час я другой сигнал поставлю, а окно как просто посылало его, так и будет дальше его просто посылать.

Rudium
P.S Спасибо за хорошее настроение, надеюсь что ты не перейдешь полностью на C++ и не покинешь нас.
Зачем куда-то переходить, если можно пользоваться всем сразу? Однопоточному мозгу этого не понять, конечно. :)
Rodegast
> Потому что на питоне это оказалось не так, как на C++

Мил-человек у тебя АРХИТЕКТУРНАЯ ошибка, а это значит что если твой слот на Qt будет работать чуть медленнее, или если сигналов будет не 100, а к примеру 1000. То ты с ней и на cpp столкнёшься.

> Здесь сигнал соединён с двумя слотами.

Такого быть не должно.
PEHDOM
Rodegast
Такого быть не должно.
Я конечно дико извиняюсь, но хотелось бы спросить почему? По моему прелесть сигналов как раз и заключается в том что их можно соединить с несколькими слотами.
Rodegast
> Я конечно дико извиняюсь, но хотелось бы спросить почему?

Потому что порядок вызова слотов точно не определён. Он предсказуем, но никто не может гарантировать что его не поменяют в следующей версии Qt.
py.user.next
Rodegast
Мил-человек у тебя АРХИТЕКТУРНАЯ ошибка
С чего ты взял-то? Сигнал - это сообщение внутри приложения, и кто на него реагирует, нигде не определяется. Это особенность параллельных программ. У события (event) то же самое устройство - оно происходит и на него реагирует кто угодно. Событие таймера или событие нажатия клавиши. А по-твоему следует, что если кто-то нажал клавишу A, то на это должен реагировать только один объект.

Rodegast
Такого быть не должно.
Где ты это прочитал?

Rodegast
Потому что порядок вызова слотов точно не определён.
Ну и что? Порядок прихода сообщений тоже не определён. Используется только тот факт, пришло ли оно вообще. Там даже есть специальные методы у сигнала, поглотить сигнал или пропустить его дальше. Как-то ты это не учёл; по-твоему, поглощение сигнала нужно просто так.
Rodegast
> С чего ты взял-то?

Если ты 100 отложенных вызовов в место 1 считаешь частью правильной архитектуры, то с тобой не о чем разговаривать.
py.user.next
Rodegast
Если ты 100 отложенных вызовов в место 1 считаешь частью правильной архитектуры, то с тобой не о чем разговаривать.
Не, ты должен сказать “я читал то-то и то-то”.
Смотри, например, есть абстрактная шина в программе, на которую приходят сообщения, и все объекты её прослушивают. И вот приходит сигнал такой-то, некоторые объекты увидели его и отреагировали. Например, работал какой-то процесс, а потом послал сигнал “я закончил”, и логгер зажурналировал сообщение об этом, а чистильщик удалил все следы того процесса. Что тебе не нравится в такой схеме, я понять не могу.
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