2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5  След.
 
 Зависимые объекты и цепочка обновлений
Сообщение12.08.2020, 23:57 
Заслуженный участник


31/12/15
936
Есть объекты (геометрические фигуры) и программа, которая их рисует. Одни объекты могут зависеть от других. Например, прямая, проведённая через две точки, зависит от этих точек. Если одну точку сдвинуть, прямая тоже должна сдвинуться. Простое решение (с помощью сигналов Qt) такое: объект, когда меняется, шлёт сигнал "изменился". Каждый зависящий от него объект, услышав сигнал, пересчитывает свои координаты и тоже шлёт сигнал "изменился". Рисовальная машинка, услышав сигнал, перерисовывает картинку. И что получается? Есть объект А, от него зависят объекты В и С. А меняется, шлёт сигнал, В меняется, шлёт сигнал, С меняется, шлёт сигнал. Рисовальная машинка перерисовывает картинку три раза! Надо бы как-то подождать, пока они все изменятся, но как это узнать? Или, допустим, есть объект А, от него зависят В и С, а от В и С зависит D. А меняется, В и С меняются и подают сигналы, объект D пересчитывает координаты два раза. Опять таки, ему надо бы подождать, пока изменятся все потомки А и затем пересчитать один раз, но как он об этом узнает?

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


11/12/05
10062
Это общеалгоритмический вопрос или по конкретному пакету?

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

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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:27 
Заслуженный участник


31/12/15
936
Общеалгоритмический. Хочется иметь по возможности распределённую систему, где объекты знают друг о друге минимум. Зато добавить новые виды сигналов. Объект знает своих "предков" (от которых он зависит), но не знает своих потомков.

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


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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:41 
Заслуженный участник


31/12/15
936
Не наоборот. Прямая проходит через две точки, она их знает и может узнавать их координаты. Если одну из точек сдвинуть, она шлёт сигнал, прямая его слышит ("пришёл сигнал от мамы") и пересчитывает свои координаты.
Можно ли способ сделать с сигналами? Допустим, я добавлю сигнал "обновляйтесь молча, не сигнальте сами". Объект A меняется, шлёт этот сигнал своим потомкам. А потом надо как-то подождать (пока они пересчитают), прежде чем слать сигнал рисовальной машинке.

-- 13.08.2020, 00:45 --

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

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


16/07/14
9166
Цюрих
А, т.е. сигналы броадкастятся?
Тогда никак. Мы не можем отличить ситуации "все уже обновились, можно перерисовывать" от "кто-то еще не прочитал сигнал".

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 00:56 
Заслуженный участник


31/12/15
936
Допустим, каждый объект будет знать своих потомков, это можно устроить. Тогда добавим сигнал "подтверждение" от потомка предку. Объект A меняется, шлёт сигнал потомкам B и C. Потомки обновляют координаты и шлют подтверждение объекту A. Когда он видит, что все потомки обновились, шлёт сигнал рисовальной машинке. Если есть внуки, принцип тот же. Сын ждёт, пока обновятся внуки (и пришлют подтверждение), после чего шлёт подтверждение родителю.

-- 13.08.2020, 00:58 --

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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 01:05 
Заслуженный участник
Аватара пользователя


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

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

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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 01:14 
Заслуженный участник
Аватара пользователя


16/07/14
9166
Цюрих
Dan B-Yallay в сообщении #1478714 писал(а):
обьект-родитель посылает броадкастный сигнал "изменился" и ждёт пока все его потомки не откликнутся тем же сигналом "изменился". После чего "родитель" шлёт запрос "перерисовывайте".
А в это время внуки, про которых родитель ничего не знает, пересчитываются...

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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 01:18 
Заслуженный участник


31/12/15
936
Объект В, получив сигнал "изменился" от родителя А, меняется сам и посылает сигнал "изменился". Дальше, он ждёт подтверждения от своих детей (С,D,E). Получив три подтверждения, шлёт подтверждение родителю. Фундированное дерево! Достаточно, чтобы каждый объект знал число своих детей (непосредственно зависящих от него объектов).

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


11/12/05
10062
mihaild в сообщении #1478715 писал(а):
А в это время внуки, про которых родитель ничего не знает, пересчитываются...

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

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

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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 02:05 


05/09/12
2587
george66 в сообщении #1478704 писал(а):
Рисовальная машинка, услышав сигнал, перерисовывает картинку.

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

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

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

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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 02:28 
Заслуженный участник


31/12/15
936
_Ivana в сообщении #1478721 писал(а):
Рисовальная машинка может не слушать сигналы а просто периодически чекать наличие изменений и необходимость перерисовки - пусть даже часть перерисовок будет выполняться "посреди изменений"

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

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

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

-- 13.08.2020, 02:43 --

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

 Профиль  
                  
 
 Re: Зависимые объекты и цепочка обновлений
Сообщение13.08.2020, 05:29 
Заслуженный участник


31/12/15
936
Вообще, должна быть какая-то наука на эту тему. Есть Erlang, там же этим занимаются?

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


12/07/15
3322
г. Чехов
george66

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 68 ]  На страницу 1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group