• 大小: 64KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: 其他
  • 标签: Qt  守护进程  

资源简介

没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,尤其是现场环境千差万别,和当初本地电脑测试环境很可能不一样,有很多特殊情况没有考虑到,如果需要保证程序7*24小时运行,则需要想一些办法能够让程序死了能够活过来,在嵌入式linux上,大部分会采用看门狗的形式来处理,程序打开看门狗驱动后,定时喂狗,一旦超过规定的时间,则硬件软复位等。这种方式相对来说比较可靠,如果需要在普通PC机上运行怎办呢?本篇文章提供一个软件实现守护进程的办法,原理就是udp通信,单独写个守护进程程序,专门负责检测主程序是否存在,不存在则启动。主程序只需要启动live类监听端口,收到hello就回复ok就行。 为了使得兼容任意程序,特意提炼出来共性,增加了多种设置。 1:可设置检测的程序名称。 2:可设置udp通信端口。 3:可设置超时次数。 4:自动记录已重启次数。 5:自动记录最后一次重启时间。 6:是否需要重新刷新桌面。 7:可重置当前重启次数和最后重启时间。 8:自动隐藏的托盘运行或者后台运行。 9:提供界面设置程序名称已经开启和暂停服务。

资源截图

代码片段和文件信息

#include “applive.h“
#include “qmutex.h“
#include “qudpsocket.h“
#include “qstringlist.h“
#include “qapplication.h“
#include “qdatetime.h“
#include “qdebug.h“

#define TIMEMS qPrintable(QTime::currentTime().toString(“HH:mm:ss zzz“))

QScopedPointer AppLive::self;
AppLive *AppLive::Instance()
{
    if (self.isNull()) {
        QMutex mutex;
        QMutexLocker locker(&mutex);
        if (self.isNull()) {
            self.reset(new AppLive);
        }
    }

    return self.data();
}

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()));
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-03-02 14:23  live\
     文件          82  2019-03-02 14:18  live\live.pro
     目录           0  2019-03-02 14:17  live\livedemo\
     文件        1666  2018-05-30 14:49  live\livedemo\applive.cpp
     文件         446  2018-05-30 14:57  live\livedemo\applive.h
     文件         201  2019-03-02 14:06  live\livedemo\frmmain.cpp
     文件         284  2019-03-02 14:06  live\livedemo\frmmain.h
     文件         495  2019-03-02 14:05  live\livedemo\frmmain.ui
     文件         570  2019-03-02 14:04  live\livedemo\livedemo.pro
     文件       23658  2019-03-02 14:17  live\livedemo\livedemo.pro.user
     文件         880  2019-03-02 14:05  live\livedemo\main.cpp
     目录           0  2019-03-02 14:17  live\livetool\
     文件        2487  2019-03-02 14:10  live\livetool\app.cpp
     文件         849  2019-03-02 13:41  live\livetool\app.h
     文件        5584  2019-03-02 14:16  live\livetool\frmmain.cpp
     文件         833  2019-03-02 14:15  live\livetool\frmmain.h
     文件        2773  2019-03-02 13:25  live\livetool\frmmain.ui
     文件         595  2019-03-02 13:50  live\livetool\livetool.pro
     文件       29845  2019-03-02 14:17  live\livetool\livetool.pro.user
     文件        1301  2019-03-02 14:15  live\livetool\main.cpp
     文件       67646  2016-06-15 15:26  live\livetool\main.ico
     文件          92  2019-03-02 13:50  live\livetool\main.qrc
     文件        2249  2018-08-22 21:39  live\livetool\trayicon.cpp
     文件        1826  2018-08-19 19:47  live\livetool\trayicon.h
     目录           0  2019-03-02 14:12  live\snap\
     文件       10924  2019-03-02 14:11  live\snap\QQ截图20190302141124.png
     文件       16677  2019-03-02 14:11  live\snap\QQ截图20190302141129.png
     文件       13291  2019-03-02 14:11  live\snap\QQ截图20190302141147.png

评论

共有 条评论