我编写了一个 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 对象并异步创建输入事件。我将应用程序重构为仅包含一个机器人单例对象,但不同的进程仍然异步调用输入命令。据我所知,这并没有改变我的应用程序的行为。我的下一步可能是围绕机器人单例创建一个同步包装器,看看是否有帮助,但鉴于症状,我不知道为什么会这样。