Приложение Java делает отображение на экране безразличным после 10 минут пользовательского времени простоя

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

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

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

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

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

  • Многопоточность
  • Стандарт и допускает ошибку, перенаправлены к javax.swing. JTextArea
  • Приложение использует GUI Swing
  • awt. Робот (очень в большой степени используемый)
  • awt. PointerInfo
  • awt. MouseInfo

Системные спецификации:

  • Windows 7 Профессионал
  • Java 1.6.0 u17

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

Спасибо!

Ross

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

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

5
задан Jason Plank 2 November 2011 в 12:39
поделиться

5 ответов

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

4
ответ дан 13 December 2019 в 19:27
поделиться

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

4
ответ дан 13 December 2019 в 19:27
поделиться

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

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

"getNumberOfSkinCareImentItiveWitingTransaction" может стать:

com.mycompany.app.product.SkinCureQuery.getNumItems ();

Тогда при использовании метод может выглядеть как "query.getNumItems ()"

-121--649399-

Подобно оператору & и & & двойной оператор является оператором "короткого замыкания".

Например:

если (условие 1 | | условие 2 | | условие 3) Если условие 1 верно, условия 2 и 3 НЕ проверяются.

если (condition1 | condition2 | condition3) При этом будут проверены условия 2 и 3, даже если 1 уже имеет значение true. Поскольку ваши условия могут быть довольно дорогими функциями, вы можете получить хорошее

повышение производительности, используя их.

Существует одно большое предостережение, в том числе в случае, если имеются ссылки или аналогичные проблемы. Например:

if (class! = null & & class.someVar < 20) Если класс имеет значение null, оператор if останавливается после "class! = null" имеет значение false. Если вы используете только &, он попытается проверить class.someVar, и вы получите

nice С Оператором Или, который может быть не такой уж большой ловушкой, как маловероятно, что вы запускаете что-то плохое,

, но это что-то иметь в виду.

Хотя никто никогда не использует операторы single & или |, если у вас нет конструкции, где каждое условие является функцией, которая должна быть выполнена

. Звучит как дизайнерский запах, но иногда (редко) это чистый способ делать вещи. Оператор & выполняет эти 3 функции,

и если одна из них возвращает значение false, выполняет блок else, в то время как | выполняет блок else только в том случае, если ни один не возвращает значение false, - может быть полезным,

но, как сказано, часто это запахи дизайна.

-121--1730792-

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

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

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

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

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

2
ответ дан 13 December 2019 в 19:27
поделиться

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

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

На другой - Windows 7 32 bit, и Java-приложение, использующее много процессорной и дисковой активности, вызывает зависание.

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

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

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

0
ответ дан 13 December 2019 в 19:27
поделиться

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

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

0
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: