Название вопроса не придумал. Короче.
Как реализовать такое. Многопоточно или лучше асинхронно.
Не прошу писать решения, хочу найти похожий пример или общие советы, перерыл много простых примеров, и не нашел, или не заметил. Нужен короче "правильный" паттерн. Или структура.
Задача.
1. По трубам течет вода, и распространяется по всем вентилям, клапанам, тройнийникам и тд. (Короче не сантехник).
2. Нужно, сделать так что бы вода от вентиля(то есть раздвоения, разветвления), до другого шла равномерно(к примеру визуализировать).
3. Трубы, как графы, но с Открытыми или закрытыми вентилями. (На вентили по функции активации, зависит откроется ли там 0-N клапанов.
4. Тут некая сложность(Для многопоточного и того варианта что хочу узнать,
ниже). Нет гарантии что слой знает,
что пришла последняя порция, то есть может встать в вечное ожидание.
5. Весь процесс Конвейерный. ТО есть источник(краник) не ждем пока порция воды добежит до конца, а запускается по частоте. На линии длинной в N слоев может быть 0 - N порций.
Условия.
- Условие. Вода течет только вперед +-89 градусов!!!
- Все клапаны распределены по слоям, каждый слой на Одной Высоте
- Только после того как вода(или будем считать цилиндрик потока), пришел на самый последний клапан N слоя,
все клапаны на N слое(для которых функция активации сработала), Открываются и кубик воды течет на N+1 слой
Теперь главное.Т
- Источников потока(кранов) несколько., тут уже нужна синхронизация, примеру 1-ый имеет частоту 1 открытие в 2 секунды, 2-ой раз в 3 секунды, а 3-ий вообще по Щелчку мышки по кнопке.
- Опять же надо что бы синхронная логика выполнялась. Вода должна течь равномерно(если визуализировать).
- До этого граф был более похож на дерево, в пред. пункте добавили несколько новых корней к дереву. Но теперь добавляем условие, что могут быть Источники могут быть между любым слоем
- Если допустим с другого источника пришел поток в момент выполняя функций активации на клапанах на N слое, то он обработается на следующей итерации(Весь процесс Конвеерный)
Так же условие. Нужен подходящей Паттерн.
К примеру есть сущности,
1. Клапаны.
2. Трубы.
3. Источники.
4. Диспетчер, который только получал сигналы, от труб, что кубик воды пришел из элемента на Слое N, и потом обрабатывал их всех.
Трубы должны сообщать диспетчеру, что готовы встать в очередь на слой. (то есть передают Функцию, которая связывает 2 клапана источник-приемник), когда ф-ия выполняется, приемник получит Value и дальше, если там условие активации сработает, то передаст ( OnChangProperty) следующим по цепи приемникам.
В Идеале, или то как я хочу. Диспетчер НЕ ДОЛЖЕН ЗНАТЬ ГРАФ
Так же там связи.
1 Источник - Множество приемников. Только
На картинке там 2 источника в один приемник. Но будем считать что у Приемника 2 разных канала входа. Которые 1 выход имеют.
Проект библиотека, который поставляет эти сущности.
Фронтенд же должен быть
RootSource.Connect(Elem1);
Elem1.Connect(elem2);
Elem1.Connect(elem3);
elem1.Connect(elem3); //....
// то есть нужно как-то внутрь запихать логику диспетчера, который не будет видеть полной схемы.