我在Qt中为Mac OS X制作了一个应用程序,并希望生成一个在关闭应用程序时不会关闭的线程。
这可能吗?如果是这样,怎么样?如果用户强制退出应用程序,我不希望停止该过程。
提前致谢。
注意:如果无法做到这一点,我有什么方法可以做到这一点? (也许在bash中调用命令?)
答案 0 :(得分:3)
根据文件http://doc.qt.io/qt-4.8/qprocess.html#startDetached
,可以通过QProcess :: startDetached启动新流程来实现目标在新进程中使用arguments参数启动程序程序,并从中分离。成功时返回true;否则返回false。 如果调用进程退出,则分离的进程将继续存在。
Unix:已启动的进程将在其自己的会话中运行,并像守护进程一样运行。
修改强>
以下是MacOS的示例
// run start script
QString scriptPath = "path-to-start-script/start.sh" ;
QString cmd = "open -a " + scriptPath;
QProcess::startDetached(cmd);
答案 1 :(得分:2)
当您终止进程时,该进程中的所有线程都会死掉 - 该进程就是线程“容器”。如果你想生成一些超出当前进程的东西,那么就会产生一个新的独立进程。
答案 2 :(得分:1)
如果您的用户强制退出应用程序,这通常意味着他们希望控制其系统上的能源或资源支出。认为你比用户更了解,而不是用户的脸。不要激怒你的用户:)
你真正想要的只是:
为此,您只需要hide the dock icon/menubar然后执行清理:
// https://github.com/KubaO/stackoverflown/tree/master/questions/hidedock-39378276
#include <QtWidgets>
#include <AppKit/AppKit.h>
void hideDockIcon() {
[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
}
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QLabel label{"Quit Me"};
label.setMinimumSize(200, 100);
label.show();
int rc = app.exec();
hideDockIcon();
qDebug() << "cleaning up";
QThread::sleep(5);
qDebug() << "cleanup finished";
return rc;
}
QT = widgets
CONFIG += c++11
TARGET = hidedock-39378276
TEMPLATE = app
OBJECTIVE_SOURCES += main.mm
LIBS += -framework AppKit
答案 3 :(得分:-1)
如果你的意思是关闭Gui窗口&#34;应用程序关闭&#34;那么它可以轻松完成......
#include "MainWindow.h"
#include <QApplication>
//////////////////////////////////////
#include <thread>
struct blabla {
std::thread th;
blabla():th([]{
// body of your thread
}) {}
~blabla(){
if(th.joinable())
th.join();
}
} singleton_obj;
/////////////////////////////////////
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
现在应用程序窗口将退出但守护程序线程将运行n后台... 享受