如何将命令行工具包装到应用中并正确退出它
How to wrap a command line tool into an app and properly quit it?
我在C++中有一个多线程命令行程序。从终端启动时,我可以正确退出 q <RET>
,这将调用一系列clean_up例程,最终将释放所有资源。请注意,如果从未按下q <RET>
程序将永远循环。另请注意,该程序会自行启动一些 GUI 窗口。
我需要将此工具包装为一个应用程序 - 没有什么特别的,只是一个漂亮的图标,其中包含所有必要的资产,以便简单的用户只需双击即可启动它。我过去曾成功地使用鸭嘴兽来制作这样的应用程序。
但是我找不到正确退出该程序的方法。没有办法从那里std::cin
我的程序,我认为在退出(从菜单或 cmd-Q(时鸭嘴兽只是发送一个 SIGTERM 或类似于我的程序的东西(我真的不能使用它来正确清理我的应用程序 - 我需要结束 main 上的无限循环,并在离开 main 时隐式调用所有析构函数(。
难道没有其他简单的方法可以将我的程序包装为.app,而是以一种我可以在退出时调用特定函数的方式吗?我想用 Cocoa/Swift 创建一个虚拟应用程序,让我的程序成为静态库并从那里调用它,但必须有一种更简单的方法。
我会用一个使用Qt框架的应用程序来包装它,该应用程序也使用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
}
您可以在应用程序中为 SIGTERM 构建处理程序。
这是我编写的一个程序来做到这一点,但在 C 中,使用"signal"函数将信号绑定到处理程序是一种常见的做法。 鉴于您使用的是C++,您可以直接将 C 与它一起使用,或者在 C++ 中找到等效的东西(其中肯定有一个相同的结构(。 关键是使用信号函数将信号与处理程序绑定。
https://github.com/jpnorair/otter/blob/master/main/main.c
- C++控制台应用程序阻止退出
- boost::asio::io_service 在线程中,不会在应用程序退出时退出
- 虽然循环即使应用了错误条件也不会退出
- _CrtIsValidHeapPointer(块)错误在应用单例-帕特恩后退出主窗口时引发
- 我在哪里编写在退出 C++ 窗口窗体应用程序之前执行的代码部分
- 正确退出 gtkmm 应用程序
- 即使主窗口关闭,也不会退出应用程序
- 退出应用并在 MFC 中返回代码
- 仅在我退出应用程序后,使用Cout.write()函数在控制台上打印字符串
- 当我要退出应用程序时,如何在QT中自动调用destructor
- 在另一个线程正在运行的情况下退出应用程序时出错
- 在退出应用程序时安全退出Qt线程
- c++允许后台线程在退出应用程序之前完成
- QT/C++,OS X:退出应用程序时可选择隐藏(),以便应用程序继续运行,并在单击dock中的图标后再次显示
- 退出应用程序时崩溃
- 在某些设备上退出应用程序后仍保留进程
- 退出应用程序前关闭线程
- 什么是正确的方式来处理强制退出应用
- Win32 c++ openprocess应该返回null,如果用户已经退出应用程序,但没有
- 日志文件不可见,除非用户退出应用程序