当前位置:网站首页>[QT dot] realize the watchdog function to detect whether the external program is running

[QT dot] realize the watchdog function to detect whether the external program is running

2022-06-27 06:09:00 Lin Qi sevenlin

Watchdog function

  • Check whether the external program is running , If not running , Then start the external program
  • Implement in the child thread , The main interface is not stuck
  • Multiple external programs can be detected

.h file

#ifndef WATCHDOGTHREAD_H
#define WATCHDOGTHREAD_H

#include <QObject>
#include <QThread>
#include <QMap>

class WatchDogThread : public QThread
{
    Q_OBJECT
public:
    WatchDogThread();

public:
    //  Add external program absolute path ( Path cannot contain spaces )
    void appendProcess(const QString &processPath);
    void appendProcess(const QList<QString> &processPathList);

    //  Set detection frequency 
    void setInterval(int msec);

protected:
    void run() override;

private:
    //  Check whether the program is running 
    bool checkProcess(const QString &processName);

    //  Start an external program 
    bool startProcess(const QString &processPath);

signals:
    void signal_sendMsg(const QString &msg);

private:
    QMap<QString, QString> m_processMap;  // key:  The program name   value:  Program absolute path 
    int m_interval;  //  Detection frequency 
};

#endif // WATCHDOGTHREAD_H

.cpp file

#include "watchdogthread.h"
#include <QTimer>
#include <QProcess>

WatchDogThread::WatchDogThread()
{
    m_interval = 1000 * 3;
}

void WatchDogThread::appendProcess(const QString &processPath)
{
    QString processName = processPath.split("/").last();
    m_processMap.insert(processName, processPath);
}

void WatchDogThread::appendProcess(const QList<QString> &processPathList)
{
    for (const auto &path : processPathList) {
        QString processName = path.split("/").last();
        m_processMap.insert(processName, path);
    }
}

void WatchDogThread::setInterval(int msec)
{
    m_interval = msec;
}

void WatchDogThread::run()
{
    QTimer timer;
    timer.setInterval(m_interval);
    connect(&timer, &QTimer::timeout, this, [&] {
        QList<QString> processNameList = m_processMap.keys();
        for (const auto &name : processNameList) {
            if (checkProcess(name)) {

            } else {
                if (startProcess(m_processMap.value(name))) {
                    emit signal_sendMsg(QString(" Program [%1] Restart successful ").arg(name));
                } else {
                    emit signal_sendMsg(QString(" Program [%1] Restart failed ").arg(name));
                }
            }
        }
    });

    timer.start();
    exec();
}

bool WatchDogThread::checkProcess(const QString &processName)
{
    QProcess process;

#ifdef Q_OS_WIN
    /***
    tasklist  View system task list 
    /fi (filter)  Displays a list of processes that match the filter 
    eq  equal 
    imagename  Image name 

    eg: tasklist /fi "imagename eq QtCreator.exe"
     Image name                        PID  Conversation name                conversation #        Memory usage 
    ========================= ======== ================ =========== ============
    qtcreator.exe                22188 Console                    1    133,732 K
    qtcreator.exe                21008 Console                    1    189,648 K
    ***/
    QString cmd = QString("tasklist /fi \"imagename eq %1\"").arg(processName);
    process.start(cmd);
#else
    QStringList arguments;
    arguments << QString("-c");  //  I need to add one -c Parameter command can be executed 
    arguments << QString("ps -A | grep %1").arg(processName);
    process.start("bash", arguments);
#endif

    process.waitForFinished();

    QString result = QString::fromLocal8Bit(process.readAllStandardOutput());
    if (result.contains(processName, Qt::CaseInsensitive)) {
        return true;
    }

    return false;
}

bool WatchDogThread::startProcess(const QString &processPath)
{
    //  Path with space , Use parametric mode , You can start 
    // process->start("C:/Program Files/Exe/111.exe", QStringList("C:/Program Files/Exe/111.exe"));
    return QProcess::startDetached(processPath);
}

原网站

版权声明
本文为[Lin Qi sevenlin]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/178/202206270546235969.html