Ограничение таймера в Win10

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Ограничение таймера в Win10

Сообщение jsa »

Это не вопрос, просто делюсь своим "открытием"
В службе которую пишу требуется раз в сутки выполнять процедуру очистки кэша от накопившихся файлов.
Использовал таймер в котором просто ставил нужное кол-во микросекунд.
TimerAlarm.Interval:=ЧасВыполнения*60*60*1000 + МинутаВыполнения*60*1000 - MilliSecondOfTheDay(Now);

И в Win8.1 это прекрасно работало. Срабатывание происходило в час и минуту указанные в настройках.
А в Win10 служба висла. Отловил вот такое сообщение
EOutOfResources: No timers available
Что там за ограничение искать и разбираться не стал.
Просто таймер поставил на 60000, и раз в минуту уменьшаю посчитанное (таким же образом) кол-во минут в отдельной переменной.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

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

PS: А приложение перекомпилировалось под Win10?
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Sharfik писал(а):В интернете пишут, что у ОС ограничено кол-во таймеров.
Да, видел такие сообщения. Но у меня в службе всего три таймера.
Sharfik писал(а):PS: А приложение перекомпилировалось под Win10?
Нет, компиляция на Win8.1
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

(ИМХО)Ерунда ! Таймер это просто слегка модифицированный обработчик события WM_TIMER то есть таймер это не поток и никогда им не был . Грубо говоря это обычное "прерывание по таймеру" но благодаря этому "из таймера" можно без проблем лезь в WinAPI и т.д.
Разумеется нужно следить чтобы не было повторных входов в процедуру (следующий вызов может произойти раньше окончания обработки текущего ) но реализуется это довольно просто (или как вариант можно продумать "РеИтерабельность" но это не очень надежно и скорее всего проведет созданию "неявной очереди выполнения"). В тоже время иногда таймер действительно может "работать как поток" но это совсем не его заслуга ( просто часть вызовов WinAPI вполне может обрабатываются в другой ните (и даже физически на другом ядре ) )
Ответить