Потокобезопасное время для выравнивания данных, собранных в несколько потоков - работает ли QElapsedTimer? - PullRequest
1 голос
/ 26 марта 2012

Я работаю над приложением (c++), которое использует несколько типов оборудования для одновременного сбора данных различных типов. Обычная схема использования - запускать различные интерфейсы к этим устройствам (отслеживание глаз, отслеживание движения, визуализация и т. Д.) Каждый в своем собственном потоке, чтобы они как можно меньше связывались друг с другом. Мне не нужна гарантия сверхточного времени, когда потоки действительно выполняются, что, как я понимаю, потребует аппаратных таймеров. Однако я хочу, чтобы потоки могли запрашивать какой-то центральный таймер, который они могут периодически использовать для добавления меток времени к собранным данным, чтобы данные можно было (полуточно) выровнять позже для анализа. Точность в миллисекундном масштабе хороша для этой цели.

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

Это разумный подход, или есть лучший "стандартный" подход (шаблон), который я должен использовать вместо этого? Или есть другая библиотека, которая лучше подходит для моих целей? В настоящее время я работаю над Windows (7 и XP), но в конечном итоге приложение будет кроссплатформенным.

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

В Qt у вас есть удобные классы, такие как QMutexLocker для выполнения синхронных вызовов.Таким образом, вы можете использовать QMutexLocker вместе с QMutex, чтобы пометить функцию как поточно-безопасную, а затем вы можете использовать QElapsedTimer для всех потоков без каких-либо проблем.

1 голос
/ 26 марта 2012

Reentrant означает, что вам нужно иметь как минимум один отдельный экземпляр для каждого потока, если вы хотите получить доступ одновременно. Вы также можете использовать QDateTime для генерации временных меток, но это также не безопасно для потоков. Поэтому я думаю, что было бы лучше мьютексировать доступ к этому методу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...