当前位置:网站首页>[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);
}
边栏推荐
- 网关状态检测 echo request/reply
- 多线程带来的的风险——线程安全
- IAR Systems全面支持芯驰科技9系列芯片
- expect脚本中使用scp命令的方法,expect脚本中scp命令获取不了值的问题完美解决方法
- [collection] Introduction to basic knowledge of point cloud and functions of point cloud catalyst software
- EasyExcel:读取Excel数据到List集合中
- 《汇编语言-王爽》第3章笔记及实验
- Senior [Software Test Engineer] learning route and necessary knowledge points
- TiDB与 MySQL 兼容性对比
- Using CSDN to develop cloud and build navigation websites
猜你喜欢

Go log -uber open source library zap use

Dev++ environment setting C language keyword display color

G1和ZGC垃圾收集器

JVM整体结构解析

426-二叉树(513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树、654. 最大二叉树)

机 器 学 习

Formation and release of function stack frame

Multithreading basic part2

Us camera cloud service scheme: designed for lightweight video production scenes

汇编语言-王爽 第8章 数据处理的两个基本问题-笔记
随机推荐
Multithreading basic Part3
Senior [Software Test Engineer] learning route and necessary knowledge points
JS to implement bidirectional data binding
Add widget on qlistwidgetitem
expect脚本中使用scp命令的方法,expect脚本中scp命令获取不了值的问题完美解决方法
创建一个基础WDM驱动,并使用MFC调用驱动
《汇编语言-王爽》第3章笔记及实验
Dev++ 环境设置C语言关键字显示颜色
Contents in qlistwidget are not displayed
多线程基础部分Part3
IDEA中关于Postfix Completion代码模板的一些设置
IAR Systems全面支持芯驰科技9系列芯片
JVM整体结构解析
【Cocos Creator 3.5.1】event. Use of getbutton()
What's new in redis4.0 - active memory defragmentation
Win 10 如何打开环境变量窗口
TiDB 中的数据库模式概述
Quick personal site building guide using WordPress
Create a basic WDM driver and use MFC to call the driver
JVM常用指令