Приложение Java отключает отображение экрана после 10 минут простоя пользователя - PullRequest
5 голосов
/ 10 февраля 2010

Я написал приложение на Java, которое позволяет пользователям создавать сценарии ввода с клавиатуры / мыши ( JMacro , ссылка не важна, только для любопытных). Я лично использую приложение для автоматизации действий персонажа в онлайн-игре на ночь, пока я сплю. К сожалению, я продолжаю возвращаться к компьютеру утром, чтобы обнаружить, что он не отвечает. После дальнейшего тестирования я обнаружил, что мое приложение приводит к тому, что компьютер перестает отвечать на запросы примерно через 10 минут простоя пользователя (даже если само приложение имитирует активность пользователя). Кажется, я не могу точно определить проблему, поэтому я надеюсь, что кто-то еще может подсказать, где искать или что может быть причиной проблемы.

Соответствующие симптомы и характеристики:

  • Безответность возникает после 10 минут простоя пользователя
  • Пользователь по-прежнему может перемещать указатель мыши по экрану
  • Все, кроме мыши, кажется замороженным ... щелчки мыши не действуют, и никакие приложения не обновляют свои дисплеи, включая рабочий стол Windows 7
  • Я оставил диспетчер задач вместе с приложением на ночь, чтобы я мог видеть последний образ диспетчера задач до того, как экран зависнет ... Java-приложение работает с нормальным использованием ЦП / памяти, а общее использование ЦП составляет всего ~ 1%
  • После перемещения мыши (другими словами, пользователь возвращается из режима ожидания), изображение на экране снова начинает обновляться через 30 минут (это очень ударил и пропустил ... иногда через 10 минут, иногда без результатов через два часа )
  • Пользователь может нажать CTRL-ALT-DEL, чтобы перейти к экрану CTRL-ALT-DEL в Windows 7 (после 30-секундной паузы). Пользователь по-прежнему может перемещать указатель мыши, но нажатие любой из опций кнопки приводит к повторному зависанию экрана
  • В некоторых очень редких случаях система никогда не зависает, и я возвращаюсь к ней утром с полной отзывчивостью
  • Приложение Java автоматически останавливает ввод сценариев посреди ночи, поэтому Windows 7 обнаруживает «реальное» бездействие и переводит мониторы в режим ожидания… из которого они успешно выходят при ручном перемещении мыши утром, когда Я просыпаюсь, несмотря на то, что дисплей на рабочем столе все еще выглядит замороженным

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

Используемые концепции программирования и пакеты Java:

  • Многопоточность
  • Стандарт out и err перенаправляются в javax.swing.JTextArea
  • Приложение использует графический интерфейс Swing
  • awt.Robot (очень интенсивно используется)
  • awt.PointerInfo
  • awt.MouseInfo

Технические характеристики системы:

  • Windows 7 Professional
  • Java 1.6.0 u17

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

Спасибо!

Ross

PS, я выложу обновление / ответ, если мне удастся наткнуться на что-то еще, пока я продолжу отлаживать это.

Обновление: мое приложение включало многопоточные процессы, каждый из которых инициализировал свои собственные объекты робота и создавал входные события асинхронно. Я реорганизовал приложение, чтобы оно содержало только один объект-одиночку Robot, но различные процессы по-прежнему асинхронно вызывают входные команды. Насколько я могу судить, это не изменило поведение моего приложения. Моим следующим шагом может быть создание синхронизированной оболочки вокруг синглтона Robot, чтобы увидеть, помогает ли это, но, учитывая симптомы, я не знаю, почему это так.

Ответы [ 7 ]

4 голосов
/ 10 февраля 2010

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

4 голосов
/ 10 февраля 2010

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

2 голосов
/ 10 февраля 2010

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

я получил эту проблему следующим образом

У меня есть несколько приложений на основе графического интерфейса, и я написал тестовый код на основе класса Robot.

но если я активировал заставку в моей системе, то тестовые случаи перестали работать ...

проверьте, есть ли такие сценарии в вашем случае

1 голос
/ 23 ноября 2010

для Росса, я вполне уверен, что у вас есть проблема с политикой, которая означает, что у вас нет разрешения и вы получаете блокировку на win7. Чтобы получить это разрешение, вы должны создать политику, и это большая история. Проверьте, какую информацию вы можете получить с сайта Sun.

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

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

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

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

0 голосов
/ 04 апреля 2011

Я столкнулся с подобной проблемой в Mac OS X 10.6.7, но это не зависало всей системы, а всего процесса java, в котором выполнялось мое приложение, и представляло интерес в случайном порядке. Обходным путем для этого был вызов:

Toolkit.getDefaultToolkit();

Перед созданием любого робота, например:

    public static void main(String[] args) {    
        Toolkit.getDefaultToolkit();
        //Blah blah
    }

Тот же вызов сделан в init методе в Robot классе, поэтому кажется, что проблемы возникают, это глупо и не имеет большого смысла для меня, но работает отлично сейчас:)

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

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

Хочу отметить, что я думаю, что это не сам NOD32, а какая-то комбинация Windows 7, Java JDK и NOD32.

0 голосов
/ 02 марта 2010

У нас есть две машины с почти одинаковым поведением с приложениями Java.

Один из них - в 64-битной Windows 7, где Eclipse 64-битная и Java 6 (64-битная) вызывают точно такое же зависание.

Другое относится к 32-разрядной версии Windows 7 и приложению Java, использующим большую нагрузку на процессор и диск, что приводит к зависанию.

Обе машины являются ноутбуками Toshiba с современными процессорами (Core 2 Duo).

Также на обеих машинах установлен антивирус NOD32.

Стандартные приложения (Office, Skype, Firefox, ...)

...