【问题标题】:How to properly close application with exit code如何使用退出代码正确关闭应用程序
【发布时间】:2012-04-30 21:29:50
【问题描述】:

在我的 wxWidgets 应用程序中,我正在检查命令行参数,如果找到,我会执行一个操作,然后关闭窗口。但是,我似乎无法让应用程序正确关闭。我想用退出代码关闭程序,例如 3。当我检查 wxApp::OnInit 中的命令行参数时,我试图只调用 exit(3),但是,这似乎不合适,因为它会导致内存泄漏wxwidgets 中的某处。

然后我尝试存储退出代码,覆盖 OnRun 并返回那里,但是,当我这样做时,return wxTheApp->OnRun(); 上的 init.cpp472 发生崩溃。

有谁知道在检测到应用程序应该关闭后,如何使用来自 wxApp 的自定义退出代码正确关闭应用程序?我还尝试重载wxApp::OnExit,但是,即使我没有重载OnRun,它也永远不会被调用。

http://codepad.org/WYiOJq55 的代码示例由于某种原因不允许在此帖子中使用代码

编辑代码粘贴:

int SomeApplication::OnRun()
{
    if(mExitCode != 0)
    {
        ExitMainLoop();
        return mExitCode;
    }
    else
        return wxApp::OnRun();
}

【问题讨论】:

  • 也许展示一个简单的独立示例来说明相关行为?
  • exit 不允许堆栈展开,因此显然任何具有非平凡析构函数的对象都会“泄漏”。
  • 我一直在尝试,但我一直收到错误消息说我的代码没有格式化,即使它是
  • 附带说明,在 C++11 中,您可以调用 std::terminate 和朋友而不是 exit
  • rubenvb:你碰巧知道使用 wxWidgets 的方法吗?

标签: c++ command-line initialization wxwidgets exit-code


【解决方案1】:

根据您的 cmets,您似乎从未启动过 wxFrame,只想尽快退出应用程序。为此,让SomeApplication 的构造函数将mExitCode 初始化为0。然后在OnInit 期间检查命令行参数,如果你想在检查后立即关闭应用程序,请将mExitCode 设置为退出代码,将return true 设置为OnInit

以下是您的OnRun 函数在不打开另一个窗口的情况下如何工作。

int SomeApplication::OnRun()
{
    if(mExitCode == 0)
        wxApp::OnRun();

    return mExitCode;
}

【讨论】:

    【解决方案2】:

    当我像这样覆盖 wxAPP::OnRun() 时:

    int MyApp::OnRun()
    {
        wxApp::OnRun();
        return 3;
    }
    

    一切正常

    如果我创建一个小批处理文件

    minimal.exe
    echo el is %ERRORLEVEL%
    

    它会产生预期的结果

    >test.bat
    
    >minimal.exe
    
    >echo el is 3
    el is 3
    

    我认为你的代码有问题

    int SomeApplication::OnRun()
    {
        if(mExitCode != 0)
        {
            ExitMainLoop();
            return mExitCode;
        }
        else
            return wxApp::OnRun();
    }
    

    是您在检查退出代码之前没有调用基类 OnRun,大概设置在 wxAPP::OnRun() 执行的代码中的某个位置

    所以我猜这对你有用

    int SomeApplication::OnRun()
    {
        wxApp::OnRun();
        return mExitCode;
     }
    

    【讨论】:

    • 看起来像这样运行函数,程序实际上并不会关闭。虽然确实调用了该函数,但从不调用返回,因为它似乎只是在 wxApp::OnRun
    • 什么功能?怎么跑?我真的不明白你的评论。当最后一个窗口关闭时,wxApp:onRun 返回。当 SomeApplication::OnRun 返回时,返回值被传递给 exit()。 ...您尝试过我建议的代码吗?
    • 运行您的 OnRun 函数将永远不会返回,因为因为我正在执行命令行检查,所以我从不打开窗口。如果我不希望根据提供的参数关闭应用程序,我只在命令行检查后打开一个窗口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    相关资源
    最近更新 更多