Мне нужно создать таймер, который будет периодически вызывать мою функцию (например, каждые 50 мс).
НО проблема в том, что мне нужно будет изменить системное время во время работы таймера.
Я хотел бы сделать это с помощью boost, чтобы код был переносимым. В противном случае я запускаю его на Linux-машине.
Вещи, которые я пробовал:
Оба они перестают работать, когда системное время настроено.
Вопрос:
Есть ли способ (предпочтительно с использованием boost) создать таймер обратного вызова, который не зависит от системного времени? (Бонус карма за пример кода)
Кажется, это ошибка под Linux. Вам нужно использовать метод сна, который использует CLOCK_MONOTONIC
(boost::this_thread::sleep
использования CLOCK_REALTIME
). boost::this_thread::sleep_for
с помощью библиотеки Chrono Boost следует сделать это, потому что она использует монотонные часы.
while (true) {
// Call your function here.
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}
В качестве альтернативы вы можете использовать boost::this_thread::sleep_until
, С этой функцией вы можете использовать собственные часы.
Но основной CLOCK_MONOTONIC
может быть под влиянием adjtime()
, Поэтому вы могли бы использовать CLOCK_MONOTONIC_RAW
в качестве альтернативы Linux.
Еще одна возможность: если вы можете использовать C ++ 11, вы можете использовать std::chrono::steady_clock
чтобы получить строгие монотонные часы.
auto start = std::chrono::steady_clock::now();
while (true) {
std::cout << (start - std::chrono::steady_clock::now()).count() << std::endl;
}
Выход здесь не изменится, если системные часы будут настроены. Но не используйте это с boost::this_thread
, Используйте это с std::this_thread::sleep_for
чтобы получить правильные результаты.
Последняя возможность просто использовать usleep
или же nanosleep
,
Но имейте в виду, что вы не сможете прервать сон с помощью двух последних опций (специфичные для STL и OS вызовы).