Я знаю, что это не очень хороший ответ, но вы должны сделать свой собственный простой фреймворк для потоков данных.
Я написал прототип DF-сервера (вместе с моим другом), который имеет несколько нереализованныхфункций пока нет: он может только передавать данные Integer и Trigger в сообщениях, и он не поддерживает паралеллизм.Я только что пропустил эту работу: порты производителя компонентов имеют список указателей функций на потребительские порты, которые устанавливаются при инициализации и вызывают его (если список не пустой).Таким образом, при возникновении события компоненты выполняют древовидную структуру графа потока данных.Поскольку они работают с целыми числами и триггерами, это чрезвычайно быстро.
Кроме того, я написал странный компонент, который имеет один потребительский порт и один порт производителя, он просто передает данные через - но в другом потоке.Это потребительская процедура быстро заканчивается, так как она просто помещает данные и устанавливает флаг для потока на стороне производителя.Грязный, но он удовлетворяет моим потребностям: он отсоединяет длинные процессы обхода дерева.
Итак, как вы могли заметить, это асинхронная система с низким трафиком для быстрых задач, где размер графика не имеет значения.
К сожалению, ваша проблема отличается на столько же от моей, сколько и одна система потока данных может отличаться от другой, вам нужно синхронное, параллельное, потоковое решение для обработки.
Я думаю, самое большоеПроблема в DF-сервере является диспетчером.Параллелизм, коллизия, потоки, приоритет ... как я уже сказал, я только что пропустил проблему, а не решил.Вы должны пропустить это тоже.И вам также следует пропустить другие проблемы.
Диспетчер
В случае синхронной архитектуры DF все компоненты должны запускаться один раз за цикл, кроме особых случаев.У них есть простое предварительное условие: доступны ли входные данные?Таким образом, вам нужно просто просканировать компоненты и передать их в поток бесплатных звонков, если данные доступны.После обработки всех них у вас будет N оставшихся компонентов, которые еще не были обработаны.Вы должны обработать список снова.После второй обработки у вас останется М остатков.Если N == M, цикл закончен.
Я думаю, что какой-то такой же материал сработает, если число компонентов меньше 100.
Связывание
Да, лучший способ привязки - это визуальное программирование.До завершения работы редактора в конфигурационном коде должен использоваться Instata, что-то вроде:
// disclaimer: not actual code
Component* c1 = new AddComponent();
Component* c2 = new PrintComponent();
c2->format = "The result is %d\n";
bind(c1->result,c2->feed);
Легко написать, хорошо читается, другое желание?
Сообщение
Вы должны передавать чистые необработанные пакеты между портами компонентов.Вам нужен только список привязок, который содержит пары указателей портов производителя и потребителя и содержит обработанный флаг, который использует «диспетчер».
Вызов проблемы
Проблема в том, что производитель должен вызывать не потребительский порт, а компонент;все переменные компонента (класса) и выстрелы находятся в компоненте.Таким образом, производитель должен напрямую вызывать общую точку входа компонента, передавая ему идентификатор потребителя, или он должен вызывать порт, который должен вызывать любой метод компонента, которому он принадлежит.
Итак,если вы можете жить с некоторыми ограничениями, я говорю, продолжайте, и напишите свою облегченную структуру.Это хорошая задача, но писать мелкие компоненты и видеть, насколько умными они могут быть связаны, создавая великолепное приложение, - настоящее удовольствие.
Если у вас есть дополнительные вопросы, не стесняйтесь их задавать, я часто просматриваю здесь ключевое слово «поток данных».
Возможно, вы сможете найти более простую модель потока данных для вашей программы.