[英]How to start a thread that doesn't close on application quit? (Qt C++)
我正在Qt中為Mac OS X開發一個應用程序,並希望產生一個在應用程序關閉時不會關閉的線程。
這可能嗎? 如果是這樣,怎么辦? 如果用戶強制退出應用程序,我不希望該過程停止。
提前致謝。
注意:如果這不可能,我有什么辦法可以做到這一點? (也許是用bash調用命令?)
根據文檔http://doc.qt.io/qt-4.8/qprocess.html#startDetached ,通過QProcess :: startDetached啟動新流程可以實現您的目標
在新進程中啟動帶有arguments arguments的程序,然后從中分離。 成功返回true; 否則返回false。 如果調用進程退出,則分離的進程將繼續運行 。
Unix:啟動的進程將在其自己的會話中運行,並充當守護程序。
編輯:
這是MacOS的示例
// run start script
QString scriptPath = "path-to-start-script/start.sh" ;
QString cmd = "open -a " + scriptPath;
QProcess::startDetached(cmd);
當您終止一個進程時,該進程中的所有線程都會死亡-該進程是線程“容器”。 如果您想產生超出當前過程的生命,請產生一個新的獨立過程。
如果您的用戶強行退出該應用程序,則通常意味着他們要控制系統上的能源或資源支出。 認為您比用戶更了解會面對用戶。 不要激怒您的用戶:)
您真正想要的是:
為此,您只需要隱藏停靠圖標/菜單 ,然后執行清理:
// 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
如果您要通過“應用程序關閉”關閉Gui窗口,則可以輕松完成...
#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();
}
現在,applicaton窗口將退出,但守護進程線程將在后台運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.