用户闲置10分钟后,Java应用程序使屏幕显示无响应

时间:2010-02-10 00:16:36

标签: java swing awt awtrobot

我编写了一个Java应用程序,允许用户编写鼠标/键盘输入脚本(JMacro,链接不重要,仅用于好奇)。我个人使用该应用程序在我睡觉的同时在线游戏中自动执行角色动作。不幸的是,我一直在早上回到电脑前发现它没有反应。经过进一步测试,我发现我的应用程序导致计算机在大约10分钟的用户空闲时间后无响应(即使应用程序本身模拟用户活动)。我似乎无法指出这个问题,所以我希望其他人可能会建议在哪里寻找或可能导致问题的原因。

相关症状和特征:

  • 用户闲置10分钟后发生无响应
  • 用户仍然可以在屏幕上移动鼠标指针
  • 除鼠标外的所有内容都显示为冻结...鼠标点击无效,且没有应用程序更新其显示,包括Windows 7桌面
  • 我让应用程序管理器沿着应用程序一夜之间离开,所以我可以在屏幕冻结之前看到最后一个任务管理器图像... Java应用程序正常CPU /内存使用率和总CPU使用率仅为~1%
  • 移动鼠标后(换句话说,用户从空闲状态回来),屏幕图像在30分钟内再次开始更新(这是非常受欢迎的,有时是10分钟,有时在两小时后没有结果) )
  • 用户可以按CTRL-ALT-DEL进入Windows 7的CTRL-ALT-DEL屏幕(暂停30秒后)。用户仍然可以移动鼠标指针,但单击任何按钮选项会导致屏幕再次冻结
  • 在一些非常罕见的情况下,系统永远不会冻结,我早上会以充分的反应回到它。
  • Java应用程序会在半夜自动停止输入脚本,因此Windows 7会检测到“真正的”空闲状态,并将显示器转为待机模式......当他们在早上手动移动鼠标时,它们成功退出我醒了,即使桌面显示仍然显示为冻结

鉴于问题的症状和特征,就好像Java应用程序导致登录用户的桌面显示停止更新,包括任何正在运行的应用程序。

使用的编程概念和Java包:

  • 多线程
  • 标准 out 错误被重新路由到javax.swing.JTextArea
  • 该应用程序使用Swing GUI
  • awt.Robot(使用频繁)
  • awt.PointerInfo
  • awt.MouseInfo

系统规格:

  • Windows 7专业版
  • Java 1.6.0 u17

总之,我应该强调,我不是在寻找任何具体的解决方案,因为我没有提出一个非常具体的问题。我只是想知道在使用我正在使用的Java库时是否有人遇到过类似的问题。我也很乐意感谢任何建议,试图进一步查明造成我问题的原因。

谢谢!

罗斯

PS,如果我在继续调试时遇到其他任何问题,我会发布更新/回答。

更新:我的应用程序涉及多线程进程,每个进程初始化自己的Robot对象并异步创建输入事件。我重构了应用程序只包含一个Robot单例对象,但不同的进程仍然异步调用输入命令。据我所知,这并没有改变我的应用程序的行为。我的下一步可能是在Robot单例周围创建一个同步包装器,看看是否有帮助,但鉴于症状,我不知道为什么会这样。

7 个答案:

答案 0 :(得分:4)

我以前在使用Robot类时遇到了问题。我完全忘记了我的所作所为,但它导致计算机锁定,我被迫重启。

答案 1 :(得分:4)

我不熟悉Robot的变幻莫测,但Uncaught exceptions in GUI applications会在事件发送线程死亡并重新启动时产生非常奇怪的结果。您可以从How uncaught exceptions are handled获得一些想法。

答案 2 :(得分:2)

如果您激活任何屏幕保护程序或类似的东西,这可能会发生,那么此机器人操作将停止工作

我通过以下方式解决了这个问题

我有一些基于GUI的应用程序,我根据Robot类编写了一些测试代码。

但是如果我在我的系统中激活了屏幕保护程序,那么这个测试用例就会停止工作......

请检查您的案例中是否存在任何此类情况

答案 3 :(得分:1)

对罗斯来说,我很确定你有一个政策问题,这意味着你没有获得许可并被win7阻止。要获得此权限,您必须创建一个策略,这是一个很大的故事。检查您可以从sun网站获得哪些信息。

对于其他人,如果您的程序在一段时间后停止工作,则可能是您没有正确处理程序中的所有异常。尝试在停止时获取该行:您可以通过向系统控制台发送一行文本并重写它以获得所需的性能来实现。

其余检查你的代码并检查它是否非常好,以确定你没有进入死锁,如果它有某些东西可能会卡住你的电脑。

同时检查CPU使用情况,看看程序是否超载,如果你的CPU温度控制将重启或自动关闭你的电脑。

如果我没有遇到问题,请告诉我;如果你解决了这个案子,请让我知道你做了什么。

答案 4 :(得分:0)

我们有两台机器与Java应用程序几乎完全相同。

一个是Windows 7 64位,其中Eclipse 64bit和Java 6(64位)导致完全相同的冻结。

其他是Windows 7 32位和Java应用程序利用大量的CPU和磁盘活动导致冻结。

这两款机器都是东芝的笔记本电脑,带有现代CPU(Core 2 Duo)。

这两台机器都安装了NOD32防病毒软件。

标准应用(Office,Skype,Firefox,...)

答案 5 :(得分:0)

我们似乎追踪了NOD32的问题。当我们禁用NOD32时,似乎beahaviour不再出现。

我想指出,我认为它不是NOD32本身,而是Windows 7,Java JDK和NOD32的某种组合。

答案 6 :(得分:0)

我在Mac OS X 10.6.7上遇到了类似的问题,但它并没有冻结整个系统,而是整个java进程,我的应用程序在其中运行,随机有趣。解决方法是调用:

Toolkit.getDefaultToolkit();

在创建任何机器人之前,例如:

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

同样的调用是在init类的Robot方法中进行的,所以似乎问题来自哪里,这是愚蠢的,对我来说没有多大意义,但现在完美地工作:)