Это не вопрос, просто делюсь своим "открытием"
В службе которую пишу требуется раз в сутки выполнять процедуру очистки кэша от накопившихся файлов.
Использовал таймер в котором просто ставил нужное кол-во микросекунд.
TimerAlarm.Interval:=ЧасВыполнения*60*60*1000 + МинутаВыполнения*60*1000 - MilliSecondOfTheDay(Now);
И в Win8.1 это прекрасно работало. Срабатывание происходило в час и минуту указанные в настройках.
А в Win10 служба висла. Отловил вот такое сообщение
EOutOfResources: No timers available
Что там за ограничение искать и разбираться не стал.
Просто таймер поставил на 60000, и раз в минуту уменьшаю посчитанное (таким же образом) кол-во минут в отдельной переменной.
Ограничение таймера в Win10
Модератор: Модераторы
В интернете пишут, что у ОС ограничено кол-во таймеров. Может и так, не знаю. Я обратил внимание, на другое. В Delphi таймеры по иному работали в принципе. Они как самостоятельный процесс были. А тут вижу что подвисает иногда таймер относительно работающих с ним процедур. Не знаю как это описать.
PS: А приложение перекомпилировалось под Win10?
PS: А приложение перекомпилировалось под Win10?
Да, видел такие сообщения. Но у меня в службе всего три таймера.Sharfik писал(а):В интернете пишут, что у ОС ограничено кол-во таймеров.
Нет, компиляция на Win8.1Sharfik писал(а):PS: А приложение перекомпилировалось под Win10?
(ИМХО)Ерунда ! Таймер это просто слегка модифицированный обработчик события WM_TIMER то есть таймер это не поток и никогда им не был . Грубо говоря это обычное "прерывание по таймеру" но благодаря этому "из таймера" можно без проблем лезь в WinAPI и т.д.
Разумеется нужно следить чтобы не было повторных входов в процедуру (следующий вызов может произойти раньше окончания обработки текущего ) но реализуется это довольно просто (или как вариант можно продумать "РеИтерабельность" но это не очень надежно и скорее всего проведет созданию "неявной очереди выполнения"). В тоже время иногда таймер действительно может "работать как поток" но это совсем не его заслуга ( просто часть вызовов WinAPI вполне может обрабатываются в другой ните (и даже физически на другом ядре ) )
Разумеется нужно следить чтобы не было повторных входов в процедуру (следующий вызов может произойти раньше окончания обработки текущего ) но реализуется это довольно просто (или как вариант можно продумать "РеИтерабельность" но это не очень надежно и скорее всего проведет созданию "неявной очереди выполнения"). В тоже время иногда таймер действительно может "работать как поток" но это совсем не его заслуга ( просто часть вызовов WinAPI вполне может обрабатываются в другой ните (и даже физически на другом ядре ) )
