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

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

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

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

Сообщение jsa » 25.05.2023 16:26:28

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

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

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

Сообщение Sharfik » 25.05.2023 17:19:15

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

PS: А приложение перекомпилировалось под Win10?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение jsa » 26.05.2023 04:44:57

Sharfik писал(а):В интернете пишут, что у ОС ограничено кол-во таймеров.

Да, видел такие сообщения. Но у меня в службе всего три таймера.

Sharfik писал(а):PS: А приложение перекомпилировалось под Win10?

Нет, компиляция на Win8.1
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

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

Сообщение Alex2013 » 31.05.2023 23:54:08

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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru