5

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

相关症状及特点:

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

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

使用的编程概念和 Java 包:

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

系统规格:

  • 视窗 7 专业版
  • Java 1.6.0 u17

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

谢谢!

罗斯

PS,如果我在继续调试时设法偶然发现其他任何东西,我会发布更新/答案。

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

4

7 回答 7

4

我以前在使用 Robot 类时遇到过问题。我完全忘记了我做了什么,但它导致计算机锁定并且我被迫重新启动。

于 2010-02-10T00:56:13.507 回答
4

我不熟悉 的变幻莫测Robot,但GUI 应用程序中的未捕获异常会在事件调度线程终止并重新启动时产生非常奇怪的结果。您可能会从如何处理未捕获的异常中得到一些想法。

于 2010-02-10T02:36:22.410 回答
2

如果您激活了任何屏幕保护程序或类似的东西,就会发生这种情况,然后这个机器人动作将停止工作

我通过以下方式遇到了这个问题

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

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

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

于 2010-02-10T03:38:37.990 回答
1

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

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

其余的检查你的代码并检查它很好,看看你没有陷入死锁,如果它有什么东西可能会卡住你的电脑。

还要检查 CPU 使用率,看看你的程序是否过载,如果它确实你的 CPU 温度控制将重新启动或自动关闭你的电脑。

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

于 2010-11-22T23:14:07.190 回答
0

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

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

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

两台机器都是东芝的笔记本电脑,配备现代 CPU(Core 2 Duo)。

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

标准应用程序(Office、Skype、Firefox、...)

于 2010-03-02T09:57:20.067 回答
0

我们似乎追查到NOD32的问题。当我们禁用 NOD32 时,似乎不再发生这种行为。

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

于 2010-05-19T08:33:27.073 回答
0

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

Toolkit.getDefaultToolkit();

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

    公共静态无效主要(字符串[]参数){    
        Toolkit.getDefaultToolkit();
        //哈哈哈哈哈哈
    }

init在课堂上的方法中进行了相同的调用,Robot所以似乎问题出在哪里,这很愚蠢,对我来说没有多大意义,但现在可以正常工作了:)

于 2011-04-04T15:53:26.347 回答