2

我编写了一个异常处理程序例程,帮助我们发现软件问题。我用

SetUnhandledExceptionFilter();

捕获任何未捕获的异常,并且效果很好。

但是,我的处理程序会弹出一个对话框,要求用户详细说明他们在崩溃时所做的事情。这就是问题所在,因为对话框与崩溃处于相同的线程上下文中,所以对话框继续泵送应用程序的消息。这给我带来了一个问题,因为我们的一次崩溃发生在 WM_TIMER 中,每分钟都会发生一次。您可以想象,如果对话框在屏幕上显示超过一分钟,则会发送 WM_TIMER 并且应用程序会重新崩溃。在这种情况下重新进入异常处理程序是个坏消息。

如果我让 Windows 处理崩溃,Windows 会显示一个似乎可以正常工作的对话框,但会停止将消息传播到应用程序的其余部分,因此不会重新发出 WM_TIMER。

有谁知道我怎样才能达到同样的效果?

谢谢丰富

4

2 回答 2

2

CreateProcess()也许您可以在检测到未处理的异常时启动单独的数据收集过程。这个单独的过程会提示用户输入有关他们刚刚在做什么的信息,而您的主应用程序可能会继续崩溃并终止。

或者,如果您不想启动另一个进程,您也许可以创建另一个带有单独消息队列的线程,这会阻止您的主线程在屏幕上显示对话框时执行任何操作当您的主线程被阻止时,它将没有机会处理WM_TIMER消息。

于 2010-02-19T10:19:48.983 回答
0

在第二个线程中显示对话框。我或多或少有同样的问题(但必须显示一个消息框而不是一个对话框)。

  • 编写一个类,在其中使用 Win32 CreateEvent 函数创建两个事件。一个事件(触发器)用于触发对话,一个事件(就绪)用于表示对话已被处理。
  • 向类添加方法“执行”并在第二个线程中启动此方法
  • 让 'execute' 方法等到设置触发事件,如果设置了则显示对话框
  • 处理完对话框后,设置“就绪”事件。
  • 如果您的应用程序在主线程中崩溃,请为对话框准备一些信息(通过类中的设置器)并设置 'trigger' 事件,然后等待 'ready' 事件。触发事件的设置将激活第二个线程,并且主线程将阻塞,直到第二个线程设置了'ready'事件
于 2010-02-19T10:21:28.860 回答