C ++exception处理程序问题

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

SetUnhandledExceptionFilter(); 

捕捉任何未捕获的exception,并且工作得很好。

然而,我的处理程序popup一个对话框,要求用户详细说明他们在崩溃时正在做的事情。 这是问题出现的地方,因为对话框和崩溃在同一个线程上下文中,对话框继续抽取应用程序的消息。 这导致我一个问题,因为我们的崩溃之一是在WM_TIMER,每分钟熄灭。 正如你可以想象,如果对话框已经在屏幕上超过了一分钟,一个WM_TIMER调度,应用程序重新崩溃。 在这种情况下重新进入exception处理程序是个坏消息。

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

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

谢谢Rich

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

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

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

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