C++ C++;异常处理程序问题

C++ C++;异常处理程序问题,c++,windows,exception,dialog,handler,C++,Windows,Exception,Dialog,Handler,我编写了一个异常处理程序例程,帮助我们发现软件中的问题。我用 SetUnhandledExceptionFilter(); 捕获任何未捕获的异常,它工作得非常好 但是,我的处理程序弹出一个对话框,要求用户详细说明崩溃时他们在做什么。这就是问题所在,因为对话框与崩溃处于相同的线程上下文中,所以对话框继续输出应用程序的消息。这给我带来了一个问题,因为我们的一个崩溃发生在WM_定时器中,它每分钟都会响。你可以想象,如果对话框在屏幕上出现超过一分钟,一个WM_定时器被调度,应用程序重新崩溃。在这种情况

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

SetUnhandledExceptionFilter();
捕获任何未捕获的异常,它工作得非常好

但是,我的处理程序弹出一个对话框,要求用户详细说明崩溃时他们在做什么。这就是问题所在,因为对话框与崩溃处于相同的线程上下文中,所以对话框继续输出应用程序的消息。这给我带来了一个问题,因为我们的一个崩溃发生在WM_定时器中,它每分钟都会响。你可以想象,如果对话框在屏幕上出现超过一分钟,一个WM_定时器被调度,应用程序重新崩溃。在这种情况下重新输入异常处理程序是个坏消息

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

有人知道我怎样才能达到同样的效果吗

谢谢
Rich

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


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

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

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

好主意。然后可以进一步扩展此单独的应用程序,而无需扩展应用程序。例如,发送包含信息的邮件,将信息发布到Web服务……我认为启动单独的流程将是最好的选择。通过这种方式,您甚至不必担心异常会如此严重地扰乱您的进程,以至于任何恢复它的尝试/显示对话框/。。。造成了进一步的损害。你也可以考虑在启动崩溃报告应用程序之后冻结你的进程,这样它就可以从外部创建一个内核转储,然后终止它。谢谢,目前创建线程已经解决了这个问题。但是,我可以看到创建流程的优势。