Создаю универсальный workflow для обработки наших геномных данных. Для этого пишется более или менее стандартный в нашей среде workflow, что-то вроде такого:
Каждая панель на рисунке – отдельный экземпляр определенного класса (наследника TShape, но не думаю, что это важно) со своими методами, графические и математические проблемы вроде более-менее решены. У каждого класса есть хотя бы один метод ввода или вывода (бывает, и по нескольку), формат данных на входе и на выходе у разных классов – разные. Одному, условно говоря, нужен массив строк, другому – просто строка, третий выдает самостоятельные массивы строк и массивы целых и т.п.
Поэтому первый вопрос – как проверять соответствие типов данных? Вот хочу я сделать связь между двумя экземплярами на рисунке, а вдруг нельзя! Либо совсем нельзя, либо нужен еще посредник (конвертор или обработчик). Ничего иного не придумал, кроме как ввести единый энумератор, в котором прописать все возможные варианты типов данных и запрашивать у экземпляров, которые хочу связать, совпадают ли у них типы ввод-вывод по энумератору или нет. Или можно проще придумать способ?
Второй момент. Если использовать TMemoryStream для обмена данными, то как я должен обрабатывать такие ситуации:
- вывод в Stream экземпляром-донором начат. Нужно сообщить экземпляру-акцептору, что можно начинать обрабатывать данные. Как? Создать поток акцептора уснувшим, а затем Resume?
- Экземпляр-акцептор обрабатывает данные быстрее, чем их записывает в Stream экземпляр-донор. Через что разумнее обработать эту ситуацию? Через CriticalSection?