1. 程式人生 > >利用QProcess::finished訊號(signal)來保持目標程式始終執行

利用QProcess::finished訊號(signal)來保持目標程式始終執行

QProcess有一個signal叫做finished,具體定義如下:

void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus)
當程序結束的時候,該signal會被髮射出去。exitCode就是程序的退出碼,而exitStatus就是退出狀態。

若在一個系統服務中,想保持另一個程序始終處於執行狀態(比如某server),那麼就可以connect這個finished訊號。詳細程式碼如下:

void keepProcessRunning()
{
    QProcess* p = new QProcess();

    QObject::connect(p, &QProcess::started, [] () {
        qDebug() << "Notepad.exe started!";
    });

    // Keep restarting if notepad.exe is finished
    QObject::connect(p, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
                     [p] (int exitCode, QProcess::ExitStatus exitStatus) {
        qWarning() << "Notepad.exe was terminated! "
                   << "Exit code: " << exitCode
                   << "Exit status: " << exitStatus;

        // restart
        qWarning() << "Notepad.exe will restart... ";
        p->start();
    });

    p->start("notepad.exe");
}

以上程式碼中,先連線了started() signal,但這僅僅是為了列印一條語句“Notepad.exe started!”。然後連線了finished signal,其主要動作是再次呼叫p->start(). 但是注意,這裡的start()是不帶引數的。在兩次connect結束之後,呼叫 p->start("notepad.exe"); 以啟動筆記本程式。connect中的p->start()之所以沒有引數,就是因為在它後面呼叫的start是有引數的。而再次start的話,是可以不再註明引數的。