шедулер
От: astlin  
Дата: 15.04.10 09:04
Оценка:
Добрый день!

Есть тривиальная задача запускать некую процедуру раз в 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 секунд без сдвигов и т.п.?
scheduler sleep time
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.