1. 思路:循环检测守护的进程是否仍然在运行,如停止运行,重启程序
2.代码
#include <QApplication>
#include <QFileDialog>
#include <QSettings>
#include <windows.h>
#include <QDebug>
#include <Tlhelp32.h>
#include <cstdlib>
#include <QDateTime>
#include <QTextStream>
#define KEY_EXE_PATH "EXE_PATH"
BOOL IsExistProcess(const char* szProcessName)
{
PROCESSENTRY32 processEntry32;
HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (((int)toolHelp32Snapshot) != -1)
{
processEntry32.dwSize = sizeof(processEntry32);
if (Process32First(toolHelp32Snapshot, &processEntry32))
{
do
{
int iLen = 2 * wcslen(processEntry32.szExeFile);
char* chRtn = new char[iLen + 1];
//转换成功返回为非负值
wcstombs(chRtn, processEntry32.szExeFile, iLen + 1);
if (strcmp(szProcessName, chRtn) == 0)
{
return TRUE;
}
} while (Process32Next(toolHelp32Snapshot, &processEntry32));
}
CloseHandle(toolHelp32Snapshot);
}
//
return FALSE;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSettings sets("sys.ini", QSettings::IniFormat);
QString exeAbsPath = sets.value(KEY_EXE_PATH).toString();
if ("" == exeAbsPath) {
QString exepath = QFileDialog::getOpenFileName(0, "选择程序", "D:/", "Exe files (*.exe)");
qDebug() << exepath;
if ("" != exepath) {
sets.setValue(KEY_EXE_PATH, exepath);
}
} else {
// 检测程序是否还在运行
while (1) {
exeAbsPath = sets.value(KEY_EXE_PATH).toString();
QString exeName = exeAbsPath.split('/').last();
if (!IsExistProcess(exeName.toStdString().c_str())) {
QString loginfo;
loginfo += QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
loginfo += "|";
loginfo += exeName;
loginfo += "|";
loginfo += "restart\n";
QFile file("restart_recored.txt");
file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
QTextStream out(&file);
out << loginfo;
file.close();
system(exeAbsPath.toStdString().c_str());
} else {
}
Sleep(2000);
}
// 关闭状态重启
}
return a.exec();
}
3. 完整代码 + 文档 + 执行程序