У меня есть многопоточная программа командной строки на C ++. При запуске из терминала я могу правильно выйти с q <RET>, который вызовет серию процедур clean_up, которые в конечном итоге освободят все ресурсы. Обратите внимание, что если д <RET> никогда не нажимается программа просто зацикливается навсегда. Также обратите внимание, что программа запускает некоторые окна графического интерфейса самостоятельно.
Мне нужно обернуть этот инструмент как приложение — ничего особенного, просто симпатичная иконка со всеми необходимыми активами внутри, чтобы простые пользователи могли запустить его, просто дважды щелкнув мышью. Я использовал Platypus с успехом, чтобы сделать такое приложение в прошлом. Однако я не могу найти способ правильно выйти из программы. Там нет никакого способа для std :: cin в моей программе оттуда, и я считаю, что при выходе (из меню или cmd-Q) platypus просто отправляет SIGTERM или что-то похожее на мою программу (я не могу использовать это, чтобы правильно очистить мое приложение — мне нужно завершить бесконечный цикл в main и иметь неявные вызовы всех деструкторов при выходе из main).
Разве нет другого простого способа обернуть мою программу как .app, но таким образом, чтобы я мог вызвать определенную функцию при выходе? Я подумал о создании фиктивного приложения с Cocoa / Swift, сделать мою программу статической lib и вызывать ее оттуда, но должен быть более простой способ.
Я бы обернул его с помощью приложения, которое использует 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
}
Вы можете создать обработчик для SIGTERM в своем приложении.
Вот программа, которую я написал, которая делает это, но в C это обычная практика — привязывать сигналы к обработчикам с помощью функции «signal». Учитывая, что вы используете C ++, вы можете использовать C непосредственно с ним или найти эквивалентную вещь в C ++ (из которых, безусловно, есть идентичная конструкция). Главное — использовать функцию сигнала, чтобы связать сигнал с обработчиком.