2010-02-19 136 views
2

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

SetUnhandledExceptionFilter(); 

捕捉任何未捕获的异常,它工作得很好。

但是我的处理程序弹出的一个对话框,询问用户细节,他们在崩溃的时候在做什么。这是问题出现的地方,因为对话与崩溃在同一个线程上下文中,对话框继续抽取应用程序的消息。这会导致我一个问题,因为我们的一个崩溃是在WM_TIMER中,每隔一分钟就会关闭。正如你可以想象的那样,如果对话已经在屏幕上超过了一分钟,WM_TIMER就会被调度并且应用程序重新崩溃。在这种情况下重新进入异常处理程序是个坏消息。

如果我让Windows处理崩溃,Windows会显示出现起作用的对话,但停止传播到应用程序的其余部分的消息,因此WM_TIMER没有得到重发。

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

感谢 丰富

回答

2

也许你可以使用CreateProcess()当您发现有未处理的异常发起一个独立的数据收集过程。这个单独的过程将提示用户输入他们刚刚在做什么的信息,而主应用程序可能会继续崩溃并终止。

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

+0

好主意。这个单独的应用程序然后可以进一步扩展,而无需扩展你的应用例如。发送邮件与信息,发布信息的Web服务,... – Patrick 2010-02-19 10:22:20

+1

我认为推出一个单独的进程将是最好的事情。通过这种方式,您甚至不必担心异常会如此糟糕,以至于任何尝试恢复它/显示对话框/ ......都会导致进一步的损坏。您也可以考虑在启动崩溃报告应用程序后冻结您的进程,以便它可以从“外部”创建核心转储,然后终止它。 – 2010-02-19 10:52:36

+0

谢谢,目前创建一个线程已经解决了这个问题。不过,我可以看到创建过程的优势。 – Rich 2010-02-19 11:30:21

0

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

  • 编写一个类,使用Win32 CreateEvent函数创建两个事件。一个事件(触发器)用于触发对话,一个事件(就绪)表示对话已处理。
  • 添加一个方法“执行”到类,直到触发事件被设置在第二螺纹
  • 让“执行”方法等待而开始这个方法,如果它被设置显示对话框
  • 后,对话框已被处理,请设置'就绪'事件。
  • 如果在主线程的应用程序崩溃,准备对话的一些信息(通过在类制定者),并设置了“触发”事件,然后等待“就绪”事件。触发事件的设置将激活第二个线程,并且主线程将阻塞,直到第二个线程已经设置'就绪'事件为止