2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3, 4, 5  След.
 
 Зависимые объекты и цепочка обновлений
Сообщение12.08.2020, 23:57 
Есть объекты (геометрические фигуры) и программа, которая их рисует. Одни объекты могут зависеть от других. Например, прямая, проведённая через две точки, зависит от этих точек. Если одну точку сдвинуть, прямая тоже должна сдвинуться. Простое решение (с помощью сигналов Qt) такое: объект, когда меняется, шлёт сигнал "изменился". Каждый зависящий от него объект, услышав сигнал, пересчитывает свои координаты и тоже шлёт сигнал "изменился". Рисовальная машинка, услышав сигнал, перерисовывает картинку. И что получается? Есть объект А, от него зависят объекты В и С. А меняется, шлёт сигнал, В меняется, шлёт сигнал, С меняется, шлёт сигнал. Рисовальная машинка перерисовывает картинку три раза! Надо бы как-то подождать, пока они все изменятся, но как это узнать? Или, допустим, есть объект А, от него зависят В и С, а от В и С зависит D. А меняется, В и С меняются и подают сигналы, объект D пересчитывает координаты два раза. Опять таки, ему надо бы подождать, пока изменятся все потомки А и затем пересчитать один раз, но как он об этом узнает?

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:21 
Аватара пользователя
Это общеалгоритмический вопрос или по конкретному пакету?

Если первое, то можно создать таблицу зависимостей для всех обьектов, в которой будет прописано: какие обьекты цепочно-зависят от каждого данного (или какой является "последним" в череде изменений). Этой таблицей пользуется отдельный процесс, который ловит все сигналы "изменился", сверяется с таблицей, ждёт когда произойдёт последнее изменение и затем посылает сигнал перерисовщику.

Как это можно организовать в продукте - вопрос, конечно, интересный.

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:27 
Общеалгоритмический. Хочется иметь по возможности распределённую систему, где объекты знают друг о друге минимум. Зато добавить новые виды сигналов. Объект знает своих "предков" (от которых он зависит), но не знает своих потомков.

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:30 
Аватара пользователя
Не пересчитывать два раза - только с предварительным составлением графа зависимостей.
Не перересовывать два раза - два варианта.
1. Заводим у каждого объекта методы update и update_with_redraw и при обновлении зовем второй, из которого завем первый для нужных объектов, а после того, как всё позвали - перерисовываем.
2. Заводим счетчик "число объектов, котоые надо обновить, но еще не обновили". При обновлении объект увеличивает этот счетчик на число объектов, которые от него зависят. При завершении своего обновления объект уменьшает этот счетчик, и, если он достиг 0 - запускает перерисовывание.
george66 в сообщении #1478707 писал(а):
Объект знает своих "предков" (от которых он зависит), но не знает своих потомков
Не наоборот? Тогда пусть мы обновили объект А, от него зависит объект В, но обновить объект В некому...

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:41 
Не наоборот. Прямая проходит через две точки, она их знает и может узнавать их координаты. Если одну из точек сдвинуть, она шлёт сигнал, прямая его слышит ("пришёл сигнал от мамы") и пересчитывает свои координаты.
Можно ли способ сделать с сигналами? Допустим, я добавлю сигнал "обновляйтесь молча, не сигнальте сами". Объект A меняется, шлёт этот сигнал своим потомкам. А потом надо как-то подождать (пока они пересчитают), прежде чем слать сигнал рисовальной машинке.

-- 13.08.2020, 00:45 --

И там внуки могут быть. Дети обновились, должны внукам сообщить, чтобы внуки тоже обновились. Пока всё потомство не обновится, перерисовывать рано.

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:55 
Аватара пользователя
А, т.е. сигналы броадкастятся?
Тогда никак. Мы не можем отличить ситуации "все уже обновились, можно перерисовывать" от "кто-то еще не прочитал сигнал".

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:56 
Допустим, каждый объект будет знать своих потомков, это можно устроить. Тогда добавим сигнал "подтверждение" от потомка предку. Объект A меняется, шлёт сигнал потомкам B и C. Потомки обновляют координаты и шлют подтверждение объекту A. Когда он видит, что все потомки обновились, шлёт сигнал рисовальной машинке. Если есть внуки, принцип тот же. Сын ждёт, пока обновятся внуки (и пришлют подтверждение), после чего шлёт подтверждение родителю.

-- 13.08.2020, 00:58 --

Сигналы броадкастятся (то есть, в принципе слышны всем), но чтобы объект реагировал на сигнал, надо специально подсоединить.

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 01:05 
Аватара пользователя
george66 в сообщении #1478713 писал(а):
Допустим, каждый объект будет знать своих потомков, это можно устроить. Тогда добавим сигнал "подтверждение" от потомка предку. Объект A меняется, шлёт сигнал потомкам B и C. Потомки обновляют координаты и шлют подтверждение объекту A. Когда он видит, что все потомки обновились, шлёт сигнал рисовальной машинке. Если есть внуки, принцип тот же. Сын ждёт, пока обновятся внуки (и пришлют подтверждение), после чего шлёт подтверждение родителю.
Зачем тогда доп.сигнал? Достаточно одного и того же. Родитель и так знает кто последний в очереди.

-- Ср авг 12, 2020 16:10:00 --

Получается так: обьект-родитель посылает броадкастный сигнал "изменился" и ждёт пока все его потомки не откликнутся тем же сигналом "изменился". После чего "родитель" шлёт запрос "перерисовывайте".

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 01:14 
Аватара пользователя
Dan B-Yallay в сообщении #1478714 писал(а):
обьект-родитель посылает броадкастный сигнал "изменился" и ждёт пока все его потомки не откликнутся тем же сигналом "изменился". После чего "родитель" шлёт запрос "перерисовывайте".
А в это время внуки, про которых родитель ничего не знает, пересчитываются...

Если мы знаем хотя бы количество потомков - то подходит вариант со счетчиком. Заводим сигналы "просигналили пересчитаться $n$ объектам" и "объект пересчитался" и отдельный объект, который поддерживает счетчик и запускает перерисовку каждый раз когда счетчик достигает нуля.

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 01:18 
Объект В, получив сигнал "изменился" от родителя А, меняется сам и посылает сигнал "изменился". Дальше, он ждёт подтверждения от своих детей (С,D,E). Получив три подтверждения, шлёт подтверждение родителю. Фундированное дерево! Достаточно, чтобы каждый объект знал число своих детей (непосредственно зависящих от него объектов).

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 01:21 
Аватара пользователя
mihaild в сообщении #1478715 писал(а):
А в это время внуки, про которых родитель ничего не знает, пересчитываются...

george66 в сообщении #1478713 писал(а):
Допустим, каждый объект будет знать своих потомков, это можно устроить.
Или внуки - это уже не потомки? Тогда я неправильно понял.

-- Ср авг 12, 2020 16:23:10 --

george66 в сообщении #1478716 писал(а):
Достаточно, чтобы каждый объект знал число своих детей (непосредственно зависящих от него объектов).
Понял, виноват.

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 02:05 
george66 в сообщении #1478704 писал(а):
Рисовальная машинка, услышав сигнал, перерисовывает картинку.

Рисовальная машинка может не слушать сигналы а просто периодически чекать наличие изменений и необходимость перерисовки - пусть даже часть перерисовок будет выполняться "посреди изменений"

george66 в сообщении #1478704 писал(а):
объект D пересчитывает координаты два раза

Имхо не перетрудится, пусть пересчитывает. На рисовальной машинке это не скажется.

ЗЫ геогебру делаете?

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 02:28 
_Ivana в сообщении #1478721 писал(а):
Рисовальная машинка может не слушать сигналы а просто периодически чекать наличие изменений и необходимость перерисовки - пусть даже часть перерисовок будет выполняться "посреди изменений"

"Перерисовка" -- не совсем правильное слово. Рисовальная машинка и так перерисовывает кадр 60 раз в секунду (картинка медленно вращается). Но когда фигуры изменились, надо переслать изменившийся массив координат с ЦП на видеокарту, а это самая медленная операция.

_Ivana в сообщении #1478721 писал(а):
Имхо не перетрудится, пусть пересчитывает. На рисовальной машинке это не скажется.
ЗЫ геогебру делаете?

Типа того. Геометрические построения в эллиптическом пространстве, красота необыкновенная.

-- 13.08.2020, 02:43 --

Но что-то я засомневался дальше. Пусть у объекта А дети В и С, а у них общий ребёнок D. Пусть А изменился, тогда В и C тоже меняются и шлют сигналы D (допустим, В и С это точки, а D - проходящая через них прямая). D получает сигнал от В (а от С ещё нет, не успел), пересчитывается и посылает сигнал "подтверждаю". Сигнал широковещательный, В и С оба его получают и довольны, хотя рисовать ещё рано (надо подождать, пока D перерисуется второй раз, получив сигнал от С). Можно в сигнале "подтверждаю" указывать имя родителя (на сигнал от В посылать подтверждение родителю В, а на сигнал от С - родителю С). Достаточно ли этого?

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 05:29 
Вообще, должна быть какая-то наука на эту тему. Есть Erlang, там же этим занимаются?

 
 
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 22:20 
george66

Точка не является наследником прямой. Вы сами не чувствуете? Прямая может быть наследником отрезка. А точка - совершенно другой объект.
Зато вместо отношения наследования имеется отношение конструктивного вхождения.

То есть определите класс point. Затем создайте класс straight, в который просто включите два объекта класса point безо всякого наследования. Все просто.

 
 
 [ Сообщений: 68 ]  На страницу 1, 2, 3, 4, 5  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group