C ++异常处理程序问题

时间:2010-02-19 10:10:56

标签: c++ windows exception dialog handler

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

SetUnhandledExceptionFilter();

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

然而,我的处理程序弹出一个对话框,要求用户详细说明他们在崩溃时正在做什么。这就是问题出现的地方,因为对话框与崩溃在同一个线程上下文中,对话框继续抽取应用程序的消息。这导致了一个问题,因为我们的一个崩溃是在WM_TIMER中,每分钟都会发生。您可以想象如果对话框已在屏幕上显示超过一分钟,则会调度WM_TIMER并重新崩溃应用程序。在这种情况下重新进入异常处理程序是个坏消息。

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

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

由于 富

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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