LINUX.ORG.RU

Спящий режим во время таймаута.

 


0

1

setTimeout(callback, 100000);

Если во время таймаута комп уйдёт в спящий режим, то после выхода, хоть через сутки, выполняется callback, как это пресечь? Кроме проверки текущего времени нет другого решения?

А его всегда надо проверять, ты не знал? Потому что если у тебя не жёсткая realtime система, callback вызывается конечно же не через 100000ms, а через случайное время не меньше этого. Плюс десяток ms только из-за шедулинга, плюс несколько секунд потому что что-то в своп залезло, плюс несколько десятков секунд потому что VM мигрирует, плюс сколько угодно потому что машина заснула или нода получила SIGSTOP. Поэтому если ты что-то считаешь за эти 100 секунд, то надо считать не за 100, а за столько сколько реально прошло с вызова setTimeout. Если слишком большие периоды тебе не нужны, можешь их отбрасывать.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

У меня ничего не считается за это время, просто откладывается действие которое должно выполниться через N минут, всё работает секунда в секунду (хотя меня устроит погрешность в полминуты). Но callback может выполнится и через сутки после сна, хотя он уже и не нужен.

Работа с Data потребует проверку в фоне каждую секунду (минуту?) не наступило ли нужное время для вызова callback’a – это единственное и правильное решение?

MaxPower ★★
() автор топика
Ответ на: комментарий от MaxPower

В колбеке и проверяй текущую дату, дополнительно, чтобы было N минут +- 0-30 сек. Костыль, конечно, ну а что делать? Не чекать же текущее время каждую 1мс в самом деле.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Короче буду велосипедить так.:

  • получаем из ввода N минут таймаута
  • сохраняем текущее время START_TIME
  • запускаем таймаут на N минут
  • после в коллбеке проверяем NOW_TIME == (START_TIME + N)

P. S. Приходиться заводить аж целую глобальную переменную START_TIME, хотя (START_TIME + N) можно в коллбек передать в параметрах.

MaxPower ★★
() автор топика
Ответ на: комментарий от MaxPower

Работа с Data потребует проверку в фоне каждую секунду (минуту?) не наступило ли нужное время для вызова callback’a – это единственное и правильное решение?

Што? В callback проверяешь сколько времени реально прошло с его установки (я объяснил что тебе абсолютно всегда нужно это делать), на основании этого можешь решить что прошло слишком много и ничего не делать.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.