6

У меня есть приложение, которое должно работать в течение длительного времени без присмотра в Windows XP и 7. Он работает на удаленной машине, на которой установлен LogMeIn, так что я могу посмотреть на нее издалека. В программе есть регулярные задачи по ведению журнала, которые отслеживаются таймерами.

Я заметил, что, если ПК был настроен на сохранение экрана после задержки, а затем отображать экран входа пользователя в систему при выходе из заставки, мое приложение перестанет работать, когда ПК войдет в заставку.

Когда я вхожу удаленно и выкидываю его из экранной заставки, он продолжает с того места, где остановился, но за прошедший период данные не регистрируются.

Я думал, что решил эту проблему, сняв флажок «при возобновлении, показывать экран приветствия» в настройках заставки, но проблема, похоже, снова вернулась. Я вообще пытался отключить заставку - не повезло.

Как я могу убедиться, что моя программа работает постоянно? Я знаю, что на экране приветствия Windows сообщает, что у меня запущено "x программ", но, похоже, это не распространяется на таймеры Windows, по крайней мере, в некоторых случаях.


Дополнительная информация:

Я добавил отладочный код и получил немного больше информации.

Приложение представляет собой приложение с графическим интерфейсом Delphi 2006. Одна из обычных задач, которую он выполняет, - это создание отчета. Пока создается отчет (это может занять некоторое время), я показываю индикатор выполнения. Это реализовано как модальная форма, где вся обработка происходит в обработчике OnPaint .

Я обнаружил, что если отчет запускается после запуска экранной заставки и установлен флажок «при возобновлении показа экрана приветствия», метод OnPaint этой модальной формы никогда не срабатывает. Событие OnShow формы запускается, и приложение затем зависает. Как только мы выходим из заставки и возобновляем работу, происходит событие OnPaint и все происходит.

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

Есть какие-нибудь предложения относительно того, как реализовать эту форму прогресса таким образом, чтобы она работала, когда ПК сохранил экран на экране приветствия?

4 ответа4

4

Вы можете настроить свою программу для запуска в качестве службы. Таким образом, он всегда работает в фоновом режиме.
Таким образом, вы можете заблокировать систему, и ваше приложение все равно будет работать.
Бесплатный инструмент Servify Это идеально подходит для ваших нужд.

Скачать Servify

2

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

  1. Используете ли вы какой-либо доменный логин на целевой машине?
  2. Заставка обычно запускается при блокировке системы
  3. В некоторых конфигурациях пользовательский логин теряется, пока система заблокирована
    (Я не могу вспомнить точные понятия здесь, но, возможно, это произойдет, если вы вошли в систему удаленно)
    Короче говоря, сессия может быть прекращена ...
  4. Наконец, если вашей программе требуется сетевое подключение (или ресурсы, разрешенные только для вашего входа в систему), эти обращения могут быть отменены по окончании сеанса.
    Это оставит заявку не в состоянии завершить в таких условиях.

Таким образом, если это ваш случай, приложение не может завершить свою деятельность из-за аннулированного доступа (после завершения сеанса), и когда вы снова входите в систему, чтобы «разблокировать» систему, сеанс перезапускается, и вы также можете перезапустить приложение ( который мог закончиться по тайм-ауту и остановиться без достижения результатов). Тем не менее, он обычно запускается снова, так как сейчас у вас запущен новый сеанс (но это приведет к той же самой проблеме, что и вы оставляете его запущенным, что в итоге приведет к завершению сеанса и блокировке экрана).

0

Я знаю, что это может звучать как более взломанное решение, но не могли бы вы просто добавить немного кода, чтобы дергать мышь каждые пару минут? Ничего особенного, просто добавьте 1, вычтите 1 в текущую позицию мыши на любой оси.

0

Окончательное решение, которое я должен был принять, состояло в том, чтобы сделать обработку в обработчике FormActivate . Затем мне пришлось закрыть форму, отправив сообщение, так как метод Close не работает до тех пор, пока не будет вызван обработчик OnPaint . В отличие от события OnPaint событие OnActivate вызывается, когда ПК находится в заставке.

procedure TReportForm.FormShow (Sender: TObject) ;
begin
OnActivate := FormActivate ;      // reinstate the handler (it will be nil from any prior call)
end;

procedure TReportForm.FormActivate (Sender: TObject) ;
begin
OnActivate := nil ;               // prevent it being called recursively
GenerateReport ;
PostMessage (Handle, WM_CLOSE, 0, 0) ;
end ;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .