当 Windows 显示“X 已停止工作”时,到底发生了什么?

当 Windows 显示“X 已停止工作”时,到底发生了什么?

我曾使用过在线备份服务(我不推荐),并购买了 Seagate 硬盘并下载了 Seagate Dashboard 来代替它。在进行初始备份两天后,我仍在继续进行备份,这时我收到了典型的 Windows 消息,上面写着“Dashboard 已停止工作”,并让我选择关闭程序或让(某人?)搜索解决方案,然后关闭程序。我决定直接关闭它,因为我不相信 Windows 会帮我搜索这类东西。

问题是,仪表板程序并没有停止。它继续消耗 CPU 和无线连接速度等等,就像过去两天一样,并且继续以同样缓慢的速度增加“完成百分比”数字(我不是在抱怨,我知道这需要很长时间——只是说它没有改变其行为)。

但显然这条消息的意思并不是我所想的那样——它检测到这个过程不知何故结束了。那么它到底是什么意思呢?我是一名程序员,所以我可以忍受相当多的技术解释……

答案1

Windows Vista 及更新版本实现了对基于 UI 的应用程序的响应能力默认情况下。

这可能会导致应用程序在前台(任务栏)或它的窗口获得焦点(对话框)时被标记为“无响应”。

当应用程序没有响应时,操作系统可以推断故障与子模块中的异常有关,而应用程序本身并不知道该异常,Windows 知道应用程序无法显示自己的错误消息、写入系统事件日志并创建崩溃报告,Windows 会显示一个对话框,表明该进程已“停止工作”。这与应用程序崩溃略有不同,因为主可执行文件的堆栈本身并未崩溃;但它通常正在等待永远不会到来的子模块的响应。事件日志通常包含有关子异常的信息。

当 Windows API 无法检测到 UI 窗口已进入用户可以在一段时间内操作的状态时,应用程序将被视为无响应。在 C# 中,您可以查询窗口状态以检查其响应能力调用Process.Responding()。此方法返回 false,(或者如果主窗口句柄如果窗口处于空闲状态并等待输入,则为 true。

有些情况下无响应程序实际上正在做很多工作,正如它应该做的那样,所以无响应的消息并不总是表示失败(只是有点糟糕的代码)。桌面窗口最终可能会变得有响应。“停止工作”然而,对话框通常确实表示永久性故障,应用程序需要中止。这并非 100% 总是正确,但通常情况下确实如此。

这些信息的性质及其相关问题与执行工作以及与外部组件和服务(如外部 API)集成时使用的编程技术密不可分。微软发布了一些关于开发一个应该做什么和不应该做什么的好信息响应式 UI 设计。不良的线程策略、对外部组件的同步和异步访问以及资源争用(锁/死锁)是常见的原因。

对于遇到“停止工作”应用程序问题的最终用户,Microsoft 建议采用广泛的故障排除路径,网址为:http://support.microsoft.com/kb/2694911显卡驱动程序通常会导致 Draw() 循环出现问题,因此可能导致无响应,系统 API 也是如此。验证驱动程序安装以及操作系统本身是否完整(使用 SFC.exe)是值得采取的步骤,以确定应用程序是否按预期与系统紧密集成。显卡和 RAM 等硬件也必须正常工作。

我希望这能有所帮助

相关内容