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