0

如果我的应用程序崩溃,我会拦截崩溃(使用函数 SetUnhandledExceptionFilter)。在我的崩溃处理程序中,我创建了一个小型转储文件,并通知用户他的应用程序已经崩溃。此通知是通过带有标志 MB_TASKMODAL 的 MessageBox 完成的,因此应用程序的其余部分被阻止。

不幸的是,这不会阻止重绘和计时器消息的处理。特别是计时器消息非常烦人,因为它们可能会执行各种中间操作(取决于我的应用程序中加载了哪些插件),甚至保存到备份文件等。

有没有一种简单的方法可以防止 Windows 发送重绘和计时器消息(同时显示“你已经崩溃”弹出窗口)?

另一种方法是使用一些全局变量,该变量将在我的崩溃处理程序中设置,并在我的应用程序中执行某些逻辑的每个地方进行检查,但这对我来说似乎是一个相当“肮脏”且不灵活的解决方案。没有更简单的方法吗?(并且只保证消息框的消息循环只处理消息框消息,不处理其他窗口的消息)。

感谢帕特里克

4

2 回答 2

1
  • 无法阻止 Windows 发送重绘和计时器消息。毕竟,您确实希望消息框本身也被重新绘制。

  • 模态消息框会阻止显示它的 UI 线程的执行。这仍然会使您生成的后台线程或您在线程池中安排的工作项运行。

  • 你已经采取了迷你转储,你知道你的应用程序已经崩溃。为什么要保留该过程并从其中显示消息框?您显然不希望应用程序能够恢复,因此此时合理的做法是启动一个小型辅助进程,该进程将向用户显示消息并终止崩溃的应用程序。

于 2009-12-17T09:05:28.620 回答
0

只有一种方法可以安全地显示崩溃对话框 - 在专门为其创建的单独线程上。在崩溃的线程上创建对话框会导致各种副作用(正如您已经注意到的),因为它将在该线程上发送和发送发往窗口的已发布和已发送消息。

问题是 - 从崩溃处理程序中创建对话框是否安全?我可以想到几个可能会出现问题的场景——特别是如果涉及到全局加载程序锁(即由于加载 dll 导致的对象初始化内部某处发生崩溃)。

因此,在应用程序启动时创建线程并使其处于待机状态可能是一个好主意。

于 2009-12-17T09:12:10.293 回答