Я писал такие вещи сотни раз.Безусловно, лучшим решением является разделение выделенного оборудования на два потока или задачи:
- один, который выполняет все необходимые операции в реальном времени
- другой, который отвечает на запросы данных и команды отпользовательский интерфейс
Эти два потока взаимодействуют друг с другом для обеспечения согласованного пространства переменных общего доступа, защищенного семафорами.Второй поток выполняет весь свой анализ и еще много чего до блокировки общего пространства, делает копию того, что ему нужно, и разблокирует.Цель состоит в том, чтобы ограничить интервал блокировки как можно более коротким временем.Часто бывает целесообразно объединить все общие переменные в одну структуру и использовать массив memcpy()
, даже если интерес представляют только несколько членов.Чем проще это взаимодействие, тем лучше.
Пользовательский интерфейс содержит
- экранов, которые, когда они видимы и активны, вызывают периодические запросы к модулю данных
Возможны и другие архитектуры, но всякий раз, когда я их видел, они превращались в огромную парящую массу патчей, чтобы обойти проблемы синхронизации и синхронизации.