Я работаю над приложением (c++
), которое использует несколько типов оборудования для одновременного сбора данных разных типов. Обычный шаблон использования состоит в том, чтобы запускать различные интерфейсы для этих устройств (отслеживание взгляда, отслеживание движения, визуализация и т. д.) каждый в своем собственном потоке, чтобы они как можно меньше мешали друг другу. Мне не нужна гарантия сверхточной синхронизации времени фактического выполнения потоков, для чего, как я понимаю, потребуются аппаратные таймеры. Однако я хочу, чтобы потоки могли запрашивать какой-либо центральный таймер, который они могут периодически использовать для добавления временных меток к собранным данным, чтобы данные можно было (полуточно) выровнять. позже на анализ. Для этой цели подходит миллисекундная точность.
Приложение использует Qt
для графического интерфейса, поэтому я подумал, что QElapsedTimer будет потенциальное решение. Однако в документации указано, что все методы являются реентерабельными, а не потоковыми. -безопасно. Правильно ли я понимаю, что для этого требуется уникальный объект QElapsedTimer
для каждого потока, который хочет использовать этот тип функций синхронизации? Если это так, мой подход состоял бы в том, чтобы потребовать от каждого потока инициализировать синхронизацию в блокирующей функции (выполняемой в основном потоке). Инициализация будет включать создание объекта-оболочки, который объединяет таймер + смещение от «основного» таймера, так что любые/все созданные таймеры «синхронизируются» с основным таймером. Это будет сделано в основном потоке, чтобы получить смещение от исходного таймера, не поддерживающего многопоточность.
Является ли это разумным подходом или есть лучший «стандартный» подход (дизайн-шаблон), который я должен использовать вместо этого? Или есть другая библиотека, которая лучше подходит для моих целей? В настоящее время я работаю над Windows (7 и XP), но в конечном итоге приложение должно стать кросс-платформенным.