如何启动一个在应用程序退出时不关闭的线程? (Qt C ++)

时间:2016-09-07 20:13:29

标签: c++ macos qt

我在Qt中为Mac OS X制作了一个应用程序,并希望生成一个在关闭应用程序时不会关闭的线程。

这可能吗?如果是这样,怎么样?如果用户强制退出应用程序,我不希望停止该过程。

提前致谢。

注意:如果无法做到这一点,我有什么方法可以做到这一点? (也许在bash中调用命令?)

4 个答案:

答案 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)

如果您的用户强制退出应用程序,这通常意味着他们希望控制其系统上的能源或资源支出。认为你比用户更了解,而不是用户的脸。不要激怒你的用户:)

你真正想要的只是:

  1. 通过正常方式退出生存的过程(按⌘-Q,从菜单中选择退出,关闭最后一个窗口等)。
  2. 停止GUI后停靠图标消失,正常和预期的行为也是如此。
  3. 在GUI消失后运行清理代码。
  4. 为此,您只需要hide the dock icon/menubar然后执行清理:

    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
    

答案 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后台... 享受