簡體   English   中英

如何啟動在應用程序退出時不會關閉的線程? (Qt C ++)

[英]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);

當您終止一個進程時,該進程中的所有線程都會死亡-該進程是線程“容器”。 如果您想產生超出當前過程的生命,請產生一個新的獨立過程。

如果您的用戶強行退出該應用程序,則通常意味着他們要控制系統上的能源或資源支出。 認為您比用戶更了解會面對用戶。 不要激怒您的用戶:)

您真正想要的是:

  1. 為了使該進程能夠正常退出(按means-Q,從菜單中選擇“退出”,關閉最后一個窗口等),以便生存。
  2. 退出GUI后,使停靠圖標消失,這是正常現象和預期行為。
  3. 要在GUI消失后運行清除代碼。

為此,您只需要隱藏停靠圖標/菜單 ,然后執行清理:

main.mm

// 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;
}

hidedock-39378276.pro

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM