Самый безопасный способ простоя приложения Delphi для ожидания таймера? - PullRequest
4 голосов
/ 13 мая 2010

Я делаю приложение delphi, которое будет работать на моем компьютере 24/7 в фоновом режиме и проверит, нужно ли ему выполнять какие-либо действия или нет, подождите 30 минут и проверьте еще раз, и т. Д.

Как я могу убедиться, что приложение не будет перегружать процессор или память из-за постоянной работы.

Ответы [ 7 ]

14 голосов
/ 13 мая 2010

Создайте таймер для запуска каждые 30 минут и вызывайте свои чеки / действия оттуда. Тогда ваше приложение может просто сидеть без дела, когда нечего делать.

В качестве альтернативы вы можете создать запланированное задание, которое периодически запускается для этого.

5 голосов
/ 13 мая 2010

Ответы по поводу таймеров - хорошие решения, и я добавляю это: Убедитесь, что событие таймера или вызванная последующая процедура проверяет наличие занятости. То есть, если вы просыпаетесь, убедитесь, что последняя партия сделана перед началом новой партии. Это легко пропустить, когда дела идут хорошо, и тогда возникает ситуация, когда резервное копирование происходит, и вся система зависает в 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 голос
/ 13 мая 2010

Ответы о таймерах в значительной степени именно то, что вы ищете. Что касается вашего вопроса о том, чтобы не перегружать процессор или память, взгляните на вашу программу в диспетчере задач. Когда он ничего не делает, он должен находиться в «устойчивом состоянии» памяти, больше не выделять ресурсы и использовать 1% или меньше процессорного времени.

Безопасно позволить большинству программ бездействовать в течение длительных периодов времени. VCL знает, как справляться с холостым ходом, не перегружая ресурсы процессора, и вам просто нужно использовать таймер, чтобы он проснулся и активировал свое событие в нужное время.

0 голосов
/ 26 мая 2010

Я бы предложил создать приложение-службу (установить тип запуска как автоматический) и использовать CreateTimerQueueTimer в качестве таймера. Утечки памяти могут быть уменьшены за счет резервирования требований к памяти / классов пула.

0 голосов
/ 17 мая 2010

Вы не сказали, но если ваше приложение использует более одного потока, это может увеличить количество ЦП, которое ОС тратит на ваш процесс (например, чтение временных интервалов и переключателей потоков).

Операционная система также может выгружать некоторые страницы вашей памяти, таким образом, использование меньшего объема памяти и / или сокращение обращений к памяти в «время ожидания» также помогает.

Итак, если вы используете только один поток и не имеете дополнительных циклов сообщений, просто вызов Sleep () может быть хорошим способом, так как это будет сигнализировать ОС, что вам вообще не нужен интервал времени для долго ждать.

Избегайте YieldThread () / SwitchToThread () и своего собственного хронометража (например, с помощью Now ()), поскольку это будет означать, что происходит много переключений потоков, чтобы ничего не делать ...

Другим методом может быть использование WaitForMultipleObjects с большим тайм-аутом, чтобы ваше приложение все еще могло отвечать на сообщения.

0 голосов
/ 13 мая 2010

Если вы хотите установить абсолютное состояние бездействия, я думаю, вы могли бы использовать функцию «сна». Хотя я не уверен, как он будет себя вести при перезагрузке. (Я предполагаю, что Windows сообщит, что приложение не отвечает.)

Если приложение не имеет основной формы и просто находится в трее (или является полностью невидимым), оно мало что даст. Основной цикл обработки сообщений будет обрабатывать все сообщения, которые он получает от ОС, но он не должен получать много. И те немногие сообщения, которые он получит, должны их обработать (сообщения о завершении работы, уведомление об изменении параметров системы и т. Д.)

Итак, я думаю, вы могли бы просто установить таймер и забыть о настройке кода, чтобы заставить вашу программу оставаться в режиме ожидания.

Если вы действительно хотите ограничить активность этого процесса до максимума, вы можете установить приоритет потока, когда входите / выходите из события таймера. Таким образом, вы устанавливаете приоритет «нормальный» при входе в событие и устанавливаете его «Низкий» при выходе из него.

0 голосов
/ 13 мая 2010

Большинство языков программирования имеют функцию "сна", которую вы можете вызвать, чтобы программа перестала делать что-либо.

Вы контролируете использование памяти; Вы можете освободить свою память перед сном и перераспределить ее, когда проснулись, но ...

Может быть, лучше просто настроить какую-нибудь повторяющуюся работу. Я не знаю, как это сделать, но я подозреваю, что с помощью Windows Scripting Host можно просто запустить приложение по любому графику.

...