Как реализовать обратный вызов таймера независимо от системного времени в C ++, используя boost

Мне нужно создать таймер, который будет периодически вызывать мою функцию (например, каждые 50 мс).
НО проблема в том, что мне нужно будет изменить системное время во время работы таймера.
Я хотел бы сделать это с помощью boost, чтобы код был переносимым. В противном случае я запускаю его на Linux-машине.

Вещи, которые я пробовал:

  • Пробовал использовать цикл while и thread :: sleep. Вычислил время сна с помощью устойчивый_клок.
  • Также пытался использовать deadline_timer

Оба они перестают работать, когда системное время настроено.

Вопрос:
Есть ли способ (предпочтительно с использованием boost) создать таймер обратного вызова, который не зависит от системного времени? (Бонус карма за пример кода)

2

Решение

Кажется, это ошибка под 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 вызовы).

3

Другие решения


По вопросам рекламы [email protected]