У меня есть асинхронная система потока данных, написанная на C ++.В архитектуре потока данных приложение представляет собой набор экземпляров компонентов, которые инициализируются при запуске, а затем связываются друг с другом с помощью предварительно определенных сообщений.Существует тип компонента, называемый Pulsar, который предоставляет «сообщение тактового сигнала» другим компонентам, которые подключаются к нему (например, задержка).Он запускает сообщение (вызывает API диспетчера потоков данных) каждые X мс, где X - значение параметра «частоты», которое задается в мс.
Короче говоря, задача состоит в том, чтобы просто вызывать функцию (метод) через каждые X мс.Вопрос в том, какой лучший / официальный способ сделать это?Есть ли какой-нибудь шаблон для этого?
Есть несколько методов, которые я нашел:
- Используйте SIGALRM .Я думаю, что сигнализация не подходит для этой цели.Хотя разрешение составляет 1 сек, это слишком редко.
- Использовать прерывание HW .Мне не нужна эта точность.Кроме того, я знаю об использовании решения, связанного с HW (сервер скомпилирован для нескольких платформ, например, ARM).
- Измерение прошедшего времени и usleep () до следующего вызова. Я неуверен, что это лучший способ измерить время для системных вызовов, связанных с временем, по 5 потокам, каждые 10 раз в секунду - но, возможно, я ошибаюсь.
- Использовать функции ядра RealTime .Я ничего не знаю об этом.Кроме того, мне не нужен кристально точный вызов, это не атомный реактор, и я не могу установить ядро RT на некоторых платформах (также доступно ядро 2.6.x).
Может быть,лучший ответ - короткая закомментированная часть исходного кода аудио / видео плеера (который я не могу найти / понять самостоятельно).
ОБНОВЛЕНИЕ (запрошено @MSalters): соавторпроект DF использует Mac OSX, поэтому мы должны найти решение, которое работает на большинстве Posix-совместимых операционных систем.системы, не только в Linux.Возможно, в будущем появится целевое устройство, которое использует BSD, или какой-нибудь ограниченный Linux.