我在C ++中有一个多线程命令行程序。当从终端启动时,我可以正确地退出q <RET>
,这将调用一系列clean_up例程,最终将释放所有资源。请注意,如果从未按下q <RET>
,程序将永远循环。另请注意,程序会自行启动一些GUI Windows。
我需要将这个工具包装成一个应用程序 - 没有什么真正的花哨,只是一个包含所有必要资产的漂亮图标,这样简单的用户只需双击即可启动它。我过去曾成功使用Platypus制作这样的应用程序。
但是我无法找到正确退出程序的方法。在我的程序中无法std::cin
,我认为在退出时(从菜单或cmd-Q)platypus只发送一个SIGTERM或类似于我的程序(我无法真正使用)这是为了正确清理我的应用程序 - 我需要在main上结束无限循环,并在离开main时隐式调用所有析构函数。
还有没有其他简单的方法将我的程序包装成.app,但是我可以在退出时调用特定的函数?我想用Cocoa / Swift创建一个虚拟应用程序,让我的程序成为一个静态库并从那里调用它,但必须有一个更简单的方法。
答案 0 :(得分: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
}
答案 1 :(得分:0)
您可以在应用中为SIGTERM构建处理程序。
这是我编写的一个程序,但是在C语言中,将信号与处理程序绑定到&#34;信号&#34;是一种常见的做法。功能。鉴于您正在使用C ++,您可以直接使用C,或者在C ++中找到相同的东西(其中肯定有相同的构造)。关键是使用信号函数将信号与处理程序绑定。