Разделяемый буфер для передачи потоков сигналов между процессами. Циклический

  !   Данная информация предназначена только только для IT-специалистов по системной интеграции модулей БИОСОФТ-М. (см. Руководства пользователя к программным продуктам)

Для оперативной и относительно безопасной пересылки потоков бинарных данных между двумя или более процессами в Interproc реализован CInterprocRingIfaceGp.

Задача

Реализовать универсальную возможность передавать потоки байтов из одного процесса в другой. Оптимизированную для пересылки приборных сигналов между параллельно работающими процессами.

Особенности
  • Буфер циклический, размер фиксируется приложением при инициализации.
  • Выбираемый приложением размер буфера позволяет обеспечить необходимый объем кеширования для избежания потерь выборок.
  • Возможность нескольким процессам считывать данные из буфера одновременно.
  • Не требует блокировок процессов на время доступа к данным за счет специальной безопасной последовательности доступа к управляющим структурам в реализацииCInterprocRingIfaceGp.
  • Специальная расширенная возможность точной синхронизации пересылаемых блоков по нескольким буферам идентичной структуры.
Ограничения
  • Только один процесс может писать в буфер.
  • Если читающий процесс не вычитал данные во время часть потока будет потеряна.
  • Посылающему процессу запрещено за один раз размещать байтов на более половины циклического буфера.
Предыстория

Базовый не универсальный код уже использовался в Paradop для пересылки спектра. Унификация потребовалась для Unimod.

Применение

Всем приложениям доступен объект CInterprocRingIfaceGp.

 i  Не забывайте менять ID буфера когда изменяется структура передаваемых данных в новой версии программы, чтобы она даже не пыталась работать со старой!
Идентификация

Каждый разделяемый буфер имеет уникальный глобальный в системе строковый идентификатор. Указывается при инициализации.

Жизненный цикл

Разделяемая память физически остается аллокированной до тех пор пока существует хотя бы один объект CInterprocRingIfaceGp инициализированный с ее идентификатором. Деструктор CInterprocRingIfaceGp автоматически освобождает память. В силу неопределенности деструктора следует вызывать CloseInterprocRing() для освобождения системных ресурсов.

Простая версия интерфейса (рекомендуется)

Все процессы открывают буфер. Только один из них пишет туда (StoreIntoInterprocRing()). Все остальные могут вычитывать (RetrieveFromInterprocRing()).

Принцип FIFO. Кто не успел вычитать тот опоздал и привет кусок сигнала.