溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Qt程序守護(hù)進(jìn)程怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-15 10:34:57 來源:億速云 閱讀:424 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“Qt程序守護(hù)進(jìn)程怎么實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Qt程序守護(hù)進(jìn)程怎么實(shí)現(xiàn)”吧!

一、前言

沒有任何人敢保證自己寫的程序沒有任何BUG,尤其是在商業(yè)項(xiàng)目中,程序量越大,復(fù)雜度越高,出錯(cuò)的概率越大,尤其是現(xiàn)場(chǎng)環(huán)境千差萬別,和當(dāng)初本地電腦測(cè)試環(huán)境很可能不一樣,有很多特殊情況沒有考慮到,如果需要保證程序7*24小時(shí)運(yùn)行,則需要想一些辦法能夠讓程序死了能夠活過來,在嵌入式linux上,大部分會(huì)采用看門狗的形式來處理,程序打開看門狗驅(qū)動(dòng)后,定時(shí)喂狗,一旦超過規(guī)定的時(shí)間,則硬件軟復(fù)位等。這種方式相對(duì)來說比較可靠,如果需要在普通PC機(jī)上運(yùn)行怎辦呢?本篇文章提供一個(gè)軟件實(shí)現(xiàn)守護(hù)進(jìn)程的辦法,原理就是udp通信,單獨(dú)寫個(gè)守護(hù)進(jìn)程程序,專門負(fù)責(zé)檢測(cè)主程序是否存在,不存在則啟動(dòng)。主程序只需要啟動(dòng)live類監(jiān)聽端口,收到hello就回復(fù)ok就行。 為了使得兼容任意程序,特意提煉出來共性,增加了多種設(shè)置。

主要功能:

  1. 可設(shè)置檢測(cè)的程序名稱。

  2. 可設(shè)置udp通信端口。

  3. 可設(shè)置超時(shí)次數(shù)。

  4. 自動(dòng)記錄已重啟次數(shù)。

  5. 自動(dòng)記錄最后一次重啟時(shí)間。

  6. 是否需要重新刷新桌面。

  7. 可重置當(dāng)前重啟次數(shù)和最后重啟時(shí)間。

  8. 自動(dòng)隱藏的托盤運(yùn)行或者后臺(tái)運(yùn)行。

  9. 提供界面設(shè)置程序名稱已經(jīng)開啟和暫停服務(wù)。

二、代碼思路

AppLive::AppLive(QObject *parent) : QObject(parent)
{
    udpServer  = new QUdpSocket(this);

    QString name = qApp->applicationFilePath();
    QStringList list = name.split("/");
    appName = list.at(list.count() - 1).split(".").at(0);
}

void AppLive::readData()
{
    QByteArray tempData;

    do {
        tempData.resize(udpServer->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;
        udpServer->readDatagram(tempData.data(), tempData.size(), &sender, &senderPort);
        QString data = QLatin1String(tempData);

        if (data == "hello") {
            udpServer->writeDatagram(QString("%1OK").arg(appName).toLatin1(), sender, senderPort);
        }
    } while (udpServer->hasPendingDatagrams());
}

bool AppLive::start(int port)
{
    bool ok = udpServer->bind(port);
    if (ok) {
        connect(udpServer, SIGNAL(readyRead()), this, SLOT(readData()));
        qDebug() << TIMEMS << "Start AppLive Ok";
    }

    return ok;
}

void AppLive::stop()
{
    udpServer->abort();
    disconnect(udpServer, SIGNAL(readyRead()), this, SLOT(readData()));
}

三、效果圖

Qt程序守護(hù)進(jìn)程怎么實(shí)現(xiàn)

到此,相信大家對(duì)“Qt程序守護(hù)進(jìn)程怎么實(shí)現(xiàn)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI