Добрый день!
Есть тривиальная задача запускать некую процедуру раз в N секунд, примерно так:
for(;;) {
Thread::sleep(N*1000);
RunTask();
}
Однако, выполение процедуры занимает какое-то время M (M<N) и т.о. время запуска процедуры сдвигается на M+N+время затраченное на возврат в начало цикла.
Я вижу грубое решение наподобие:
int time_left = N; // период в секундах
for (;;) {
Thread::sleep(time_left*1000); // Засыпаем до следующего периода
Timestamp starting_time; // Время запуска задачи
RunTask();
Timestamp ending_time; // Время окончания задачи
int diff = ending_time - starting_time; // время выполнения в микросекундах
time_left = N * 1000 - diff / 1000; // Вычисляем время спячки
}
Но смущают возникшие задачи по корректировке времени. Вопрос: есть ли более точный и изящный путь запускать задачу каждые N секунд без сдвигов и т.п.?