Добрый день.
Есть родительское приложение, которое дергает процедуры внутри PS ( через GetProcMethod(Function_Name) ), передавая им строковые данные, которые приходят от нескольких внешних источников (UDP, TCP, RS232, которых, разумеется, самих может быть по несколько штук). На каждый источник - своя процедура для обработки. То есть имеется головное приложение, которое в идеале не перекомпилируется, и подсистема Pascal Script в нем, на котором пользователь пишет свою программу по обработке данных, поступающих от разных источников. Если еще точнее, у меня есть готовое приложение - визуализатор, которому желательно придать больше гибкости без перекомпиляции.
К основному приложению я кое-что уже прикрутил, и это работает, нужные процедуры, описанные внутри PS также вызываются и получают извне данные. Вот что можно создать и использовать из PS (экземпляры этого, создаются, естественно, в основном приложении):
1. Создаются UDP "серверы" и "клиенты" на базе Synapse (m_pSocket := TUDPBlockSocket.Create;) Каждый новый экземпляр в отдельном потоке.
2. Создаются TCP серверы и клиенты на базе Indy 10 + его же Antifreeze. Тут, я понимаю, отдельные потоки создаются автоматически.
3. Просто создаются экземпляры Cport.TComPort. Вот тут честно говоря не знаю с потоковой моделью. С несколькими экземплярами (разными COM-портами) работу пока толком не проверял. Но с одним Com-портом из PS обмен данными устойчивый.
Главный вопрос вот в чем: судя по всему, PS устроен так, что вызов какой-то другой процедуры, пока работает первая, не допустим. Время выполнения процедур на PS у меня, в общем-то не большое, но накладки будут обязательно. Самое простое, видимо, сделать внешний флаг, который быдет устанавливать и сбрасывать каждая процедура, работающая внутри PS а очередь исполнения внутренних процедур опять же всести снаружи, вне PS. Но не хотелось бы, чтобы пользователи PS задумывались о флагах, а просто писали бы, "как обычно". Не думая о порядке выполнения как таковом.
Флаг, что процедура на PS завершила свою работу, и основное приложение может вызывать опять эту же или другую процедуру из PS мне пока кажется единственным, но каким-то кривым решением. Это значит навязывать пользователю некую парадигму оформлени процедур, отличную от чисто Паскалевской. Вот думаю, и ничего не придумывается пока получше.