【问题标题】:C++ Exception Handler problemC++异常处理问题
【发布时间】:2011-01-18 17:19:12
【问题描述】:

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

SetUnhandledExceptionFilter();

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

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

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

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

谢谢 丰富

【问题讨论】:

    标签: c++ windows exception dialog handler


    【解决方案1】:

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

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

    【讨论】:

    • 好主意。然后可以进一步扩展此单独的应用程序,而无需扩展您的应用程序。例如。发送包含信息的邮件,将信息发布到 Web 服务,...
    • 我认为启动一个单独的进程将是最好的做法。通过这种方式,您甚至不必担心异常会严重扰乱您的进程,以至于任何试图恢复它/显示对话框/...都会导致进一步的损坏。您也可以考虑在启动崩溃报告应用程序后冻结您的进程,以便它可以“从外部”创建核心转储然后终止它。
    • 谢谢,目前创建一个线程已经解决了这个问题。但是我可以看到创建流程的优势。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 2011-11-02
      相关资源
      最近更新 更多