【问题标题】:How to wrap a command line tool into an app and properly quit it?如何将命令行工具包装到应用程序中并正确退出?
【发布时间】:2016-02-03 13:15:12
【问题描述】:

我有一个 C++ 中的多线程命令行程序。从终端启动时,我可以使用q <RET> 正确退出,这将调用一系列最终释放所有资源的 clean_up 例程。请注意,如果从未按下q <RET>,则程序将永远循环。另请注意,该程序会自行启动一些 GUI 窗口。

我需要将此工具包装为一个应用程序 - 没什么特别的,只是一个漂亮的图标,其中包含所有必要的资产,以便简单的用户只需双击即可启动它。我过去曾成功使用 Platypus 制作过这样的应用程序。

但是我找不到正确退出程序的方法。从那里无法在我的程序中std::cin,我认为在退出时(从菜单或 cmd-Q)鸭嘴兽只会发送一个 SIGTERM 或类似于我的程序的东西(我不能真正使用它来正确清理我的应用程序 - 我需要结束 main 上的无限循环,并在离开 main 时隐式调用所有析构函数。

是否有任何其他简单的方法可以将我的程序包装为 .app,但我可以在退出时调用特定函数?我想用 Cocoa/Swift 创建一个虚拟应用程序,让我的程序成为一个静态库并从那里调用它,但必须有一个更简单的方法。

【问题讨论】:

    标签: c++ macos packaging terminate


    【解决方案1】:

    我会用一个使用 Qt Framework 的应用程序来包装它,它也使用 C++。

    使用QProcess 启动程序,文档说明:-

    QProcess 类用于启动外部程序并与它们通信

    这里有一个简单的例子说明你可以做什么......

    #include <QApplication>
    int main(int argc, char *argv[])
    {
        // Main application class
        // Use QCoreApplication instead, if this is not a GUI app
        QApplication app(argc, argv);
    
        // launch the process with the given arguments
        QProcess *myProcess = new QProcess(parent);
        myProcess->start(program, arguments);
    
        if (!myProcess.waitForStarted())
            return -1;
    
        // quit the app as soon as it has started, but 
        // just for demonstration purposes
        myProcess.write("q"); 
    
        return app.exec(); // starts the event loop
    }
    

    【讨论】:

      【解决方案2】:

      您可以在您的应用中为 SIGTERM 构建一个处理程序。

      这是我编写的一个执行此操作的程序,但在 C 中,将信号绑定到具有“信号”函数的处理程序是一种常见的做法。鉴于您使用的是 C++,您可以直接使用 C,或者在 C++ 中找到等价的东西(其中肯定有相同的构造)。关键是使用信号函数将信号与handler绑定。

      https://github.com/jpnorair/otter/blob/master/main/main.c

      【讨论】:

        猜你喜欢
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-10
        • 1970-01-01
        • 2018-02-03
        相关资源
        最近更新 更多