【问题标题】:How to know if my program crashed the last time it ran?如何知道我的程序上次运行时是否崩溃?
【发布时间】:2009-11-11 19:48:15
【问题描述】:

如果我的程序没有正确关闭,系统就会变得不稳定。真的没有解决方法。所以,如果我的程序崩溃并且没有正确地关闭,那么当他尝试再次运行它时,我需要告诉用户系统处于不稳定状态。正确的方法是在我启动时创建一个锁定文件,并在我正确退出时删除它。如果我开始并且该文件存在,那么我知道我之前崩溃了。这是正确的方法吗?

【问题讨论】:

    标签: windows winapi process


    【解决方案1】:

    两件事可能有用:

    • Application Recovery and Restart API 可用于 Vista 和 Win7。您可以指定操作系统将为您调用的恢复函数,以便通知用户
    • 创建一个unhandled exception filter,如果您在其他地方遇到崩溃,您可以在其中尝试执行一些真正关键的恢复。这也适用于 XP。我以前使用过这种技术来关闭驱动程序,否则如果关闭不正确,它们会挂起。

    【讨论】:

      【解决方案2】:

      如果您的程序崩溃并重新启动机器,事情是否仍处于不稳定状态?如果不是,那么锁定文件不是您希望采取的方法,因为该文件在重新启动后仍然存在。尝试使用global atom table 的解决方案。

      // Test if the application has crashed since the last reboot
      ATOM myAtom = GlobalFindAtom ("MySecretName");
      if (myAtom != 0)
      {
        // We crashed on last run, inform user and exit
        // ...
        exit (0);
      }
      
      // Create a global atom which will be destroyed only on clean termination
      myAtom = GlobalAddAtom ("MySecretName");
      
      // Run your main program here
      // ...
      
      // Clean termination, delete the atom
      GlobalDeleteAtom (myAtom);
      

      【讨论】:

        【解决方案3】:

        请您考虑一下,但在与您的应用无关的情况下,锁定文件可能不会被删除,例如网络错误、文件系统错误、操作系统错误。

        因此,根据您的要求,如果知道当前状态是否有效是绝对关键的,您可能需要通过检查所有因变量和状态来确定有效性,而不是仅仅依赖锁定文件。否则,它可能是一种监视退出状态的简单方法。只是不要依赖它来确定是否应该重新发射导弹。

        【讨论】:

        • 好点。我想我会写一个标志我的设置文件,而不是让生活更轻松。谢谢
        【解决方案4】:

        Microsoft Word(也包括 PPT/Excel)遵循类似的方法。当以写入模式打开文档时会创建一个隐藏文件,一旦应用程序正常退出,它就会被删除。该文件可能包含更多信息,例如每隔“x”分钟自动保存文档等,但关键是您的观点是有效的:-)

        【讨论】:

          猜你喜欢
          • 2015-03-10
          • 2015-05-16
          • 2019-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多