【QT小作】实现看门狗功能,检测外部程序是否在运行

看门狗功能
  • 检测外部程序是否在运行,若未运行,则启动外部程序
  • 在子线程中实现,不卡主界面
  • 可检测多个外部程序

.h文件

#ifndef WATCHDOGTHREAD_H
#define WATCHDOGTHREAD_H

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

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

public:
    // 添加外部程序绝对路径(路径不能带空格)
    void appendProcess(const QString &processPath);
    void appendProcess(const QList<QString> &processPathList);

    // 设置检测频率
    void setInterval(int msec);

protected:
    void run() override;

private:
    // 检测程序是否正在运行
    bool checkProcess(const QString &processName);

    // 启动外部程序
    bool startProcess(const QString &processPath);

signals:
    void signal_sendMsg(const QString &msg);

private:
    QMap<QString, QString> m_processMap;  // key: 程序名  value: 程序绝对路径
    int m_interval;  // 检测频率
};

#endif // WATCHDOGTHREAD_H

.cpp文件

#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("程序[%1]重新启动成功").arg(name));
                } else {
                    emit signal_sendMsg(QString("程序[%1]重新启动失败").arg(name));
                }
            }
        }
    });

    timer.start();
    exec();
}

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

#ifdef Q_OS_WIN
    /***
    tasklist 查看系统任务列表
    /fi (filter) 显示一系列符合筛选器指定的进程
    eq 相等
    imagename 映像名称

    eg: tasklist /fi "imagename eq QtCreator.exe"
    映像名称                       PID 会话名              会话#       内存使用
    ========================= ======== ================ =========== ============
    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");  // 需要加个-c参数命令才能执行
    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)
{
    // 路径带空格,使用带参模式,可以启动
    // process->start("C:/Program Files/Exe/111.exe", QStringList("C:/Program Files/Exe/111.exe"));
    return QProcess::startDetached(processPath);
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
您的问题是关于基于QT框架的音乐播放器看门狗程序卡死时自动重新运行音乐播放器QT程序实现方法,是吗? 如果是这样的话,您可以考虑使用QtQProcess类来启动和监控音乐播放器程序。具体实现步骤如下: 1. 使用QProcess类启动音乐播放器程序,并保存其进程ID(PID); 2. 使用QTimer类定时检查音乐播放器程序是否仍在运行,如果未运行,则重新启动音乐播放器程序,并更新其进程ID; 3. 如果发现音乐播放器程序卡死,可以使用QProcess::terminate()函数强制结束进程,并重新启动音乐播放器程序。 下面是一个简单的示例代码,供您参考: ``` #include <QApplication> #include <QProcess> #include <QTimer> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 启动音乐播放器程序 QProcess process; process.start("musicplayer.exe"); int pid = process.processId(); // 定义定时器,定时检查音乐播放器程序是否仍在运行 QTimer timer; QObject::connect(&timer, &QTimer::timeout, [&]() { // 如果音乐播放器程序已经退出,重新启动它 if (!QProcess::isProcessRunning(pid)) { process.start("musicplayer.exe"); pid = process.processId(); } }); timer.start(5000); // 每5秒检查一次 return a.exec(); } ``` 以上示例代码仅供参考,具体实现还需要根据您的实际情况进行修改。另外,由于在Windows系统中使用QProcess类启动的进程会在父进程结束时自动关闭,因此您需要确保主程序不会意外退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值