Самый безопасный способ простаивать приложение Delphi ждать таймера?

StackOverflow https://stackoverflow.com/questions/2829582

Вопрос

Я делаю приложение 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 в качестве таймера. Утечки памяти могут быть смягчены путем резервирования требований к памяти / классами объединения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top