Самый безопасный способ простаивать приложение Delphi ждать таймера?
-
26-09-2019 - |
Вопрос
Я делаю приложение Delphi, которое будет работать на моем ПК 24/7 на заднем плане и проверит, должен ли он делать какие-то действия или нет, подождать 30 минут и проверять снова и так далее.
Как я могу убедиться, что приложение не перегрузят процессор или память из-за работы все время.
Решение
Большинство языков программирования имеют функцию «сна», которую вы можете позвонить, чтобы сделать программу прекратить делать вещи.
Вы контролируете использование памяти; Вы можете освободить вашу память, прежде чем спать и перераспределить его, когда он проснулся, но ...
Возможно, лучше просто настроить некоторую повторяющуюся работу. Я не знаю, как это сделать, но я подозреваю, что есть способ с Windows Scripting Host, чтобы просто запустить ваше приложение в любом плане, который вы хотите.
Другие советы
Создать таймер Запустить каждые 30 минут и позвоните в свои чеки / действия оттуда. Тогда ваше приложение может просто сидеть холостыми, когда нечего делать.
Кроме того, вы можете создать запланированную задачу, которая просто проходит периодически, чтобы сделать это.
Ответы о таймерах - хорошие решения, и я добавляю это: убедитесь, что событие таймера или последующая процедура вызывается, проверяет наличие занятых. Т.е. если вы просыпаетесь, убедитесь, что последняя партия выполняется до начала новой партии. Это легко пропустить, когда все хорошо течет, а потом у вас есть ситуация, когда вещи поддерживаются, и вся система logjams в 8 утра, потому что что-то плохое произошло в полночь, и теперь есть 16 звонков, сложенных (или потоки , процессы и т. Д.).
Так что напишите свое место таймера, как это:
OnMyTimer...
begin
MyTimer.Enabled := false;
try
DoSomethingForALongTime; // Usually runs in 45 seconds, but sometimes takes 45 minutes!
finally
MyTimer.Enabled := true; // and (SomeAbortRequest = False) and (SomeHorribleErrorCount = 0);
end;
end;
Ответы о таймерах в значительной степени именно то, что вы ищете. Что касается вашего вопроса о том, что не перегружает ЦП или память, посмотрите на свою программу в диспетчере задач. Когда он ничего не делает, он должен сидеть в «устойчивом состоянии» памяти, не выделяя больше, а использование 1% или меньше времени ЦП.
Это безопасно, чтобы позволить большинству программ простоя в течение длительных периодов. VCL знает, как обрабатывать на холостом ходу, не хотела для вас ресурсов CPU, и вам просто нужно использовать таймер, чтобы убедиться, что он просыпается и активирует свое событие в нужное время.
Если вы хотите обеспечить абсолютное состояние бездействия, я думаю, вы можете использовать функцию «сна». Хотя я не уверен, как это будет вести себя на перезагрузке. (Я думаю, окна сообщит о приложении как не отвечающую.)
Если приложение не имеет основной формы и просто сидеть в лоток (или быть полностью невидимым), это не значит. Основной цикл сообщений будет обрабатывать все сообщения, которое он получает от ОС, но он не должен получать много. И несколько сообщений оно получит, он должен их обработать (отключение сообщений, системные параметры изменения уведомления и т. Д.)
Итак, я думаю, что вы могли бы просто настроить таймер и забыть о настройке кода, чтобы заставить вашу программу остаться на холостом ходу.
Если вы действительно хотите ограничить эту процедуру активности максимум, вы можете установить приоритет потока при введении / покинете событие таймера. Таким образом, вы установили приоритет к «нормальному», когда вы вводите событие, и установите его на «низкий» при выходе из него.
Вы не сказали, но если ваша приложение использует более одного потока, это может добавить к количеству процессоров, которую ОС проводит на ваш процесс (например, прочитано на частоте временных срезов и переключателей потоков).
ОС также может назвать некоторые из ваших страниц памяти, таким образом, используя меньше памяти и / или уменьшения доступа к памяти в «время ожидания».
Итак, если вы используете только один нить и не имеете дополнительных сообщений-петлей, просто вызывая сон () может быть хорошим способом, так как это будет сигналировать ОС, что вам не нужен временный нарез, чтобы приходить.
Избегайте урожая () / SwitchToThRead () и вашего собственного ведения времени (используя сейчас (), например), так как это будет означать многое количество переключения потока, чтобы сделать .... ничего!
Другой метод может быть использован WaitformultiPleObjects. С большим таймаутом, поэтому ваше приложение все еще может отвечать на сообщения.
Я бы предложил создать сервисное приложение (установить тип запуска в качестве автоматического) и использовать CreateTimerqueEuetimer в качестве таймера. Утечки памяти могут быть смягчены путем резервирования требований к памяти / классами объединения.