前言
C++ QT 使用子线程监测可执行文件exe是否运行
一、原理
定义了一个CheckProcessThread类,该类继承自QThread,并在run()方法中实现了可执行文件的监测逻辑。在isProcessRunning()方法中,我们使用Windows API函数CreateToolhelp32Snapshot()和Process32First()/Process32Next()函数来遍历进程列表,查找可执行文件是否在运行。如果找到了该进程,我们返回true,否则返回false。
在main()方法中,我们创建了一个CheckProcessThread对象,并调用start()方法启动子线程。在子线程中,我们将不断地监测可执行文件是否在运行,直到子线程被中断。
需要注意的是,如果您使用Windows API函数来监测进程是否在运行,您需要包含Windows.h头文件。此外,Windows API函数可能会因为Windows版本不同而略微有所不同,因此您可能需要根据您的操作系统版本来调整代码。
二、实现
//CheckProcessThread.h
#pragma once
#include <QCoreApplication>
#include <QThread>
#include <windows.h>
#include <tlhelp32.h>
#include <QDebug>
class QThread;
class CheckProcessThread : public QThread
{
Q_OBJECT
public:
explicit CheckProcessThread(QThread *parent = Q_NULLPTR);
void run() override;
signals:
void signal_is_open(bool isopen);
private:
bool isProcessRunning(const QString& processName);
void char_to_wchar(const char* ch, std::wstring& w_str);
};
//CheckProcessThread.cpp
#include "CheckProcessThread.h"
CheckProcessThread::CheckProcessThread(QThread *parent)
: QThread(parent)
{
}
void CheckProcessThread::run()
{
while (!isInterruptionRequested()) {
// 检测进程是否在运行
if (isProcessRunning("XXX.exe")) { // 替换为您要监测的可执行文件名称
emit signal_is_open(true);
qDebug() << "Process XXX.exe is running";
}
else {
emit signal_is_open(false);
qDebug() << "Process XXX.exe is not running";
}
// 等待一段时间后再检查
sleep(2);
}
}
bool CheckProcessThread::isProcessRunning(const QString& processName)
{
// 将QString转换为std::wstring
std::wstring wProcessName = processName.toStdWString();
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) {
return false;
}
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapshot, &pe)) {
do {
std::wstring wExeFile;
char_to_wchar(pe.szExeFile, wExeFile);
if (wExeFile == wProcessName) {
CloseHandle(hSnapshot);
return true;
}
} while (Process32Next(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
return false;
}
void CheckProcessThread::char_to_wchar(const char* ch, std::wstring& w_str)
{
wchar_t* wchar;
int len = MultiByteToWideChar(CP_ACP, 0, ch, strlen(ch), NULL, 0);
wchar = new wchar_t[len + 1];
MultiByteToWideChar(CP_ACP, 0, ch, strlen(ch), wchar, len);
wchar[len] = '\0';
w_str = wchar;
delete[]wchar;
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
CheckProcessThread *thread = new CheckProcessThread;
thread->start();
connect(thread, &CheckProcessThread::signal_is_open, this, [=](bool isopen) {
if (isopen)
{
//可执行启动
}
else
{
//可执行未启动
}
});
return app.exec();
}
推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/VsFMs