做一个植物大战僵尸的辅助,需要监测植物大战僵尸是否运行,在网上找了很久没有一个简单适用的,于是自己摸索一下,QT5.9.9创建一个子线程监测某应用是否运行,主要是解决子线程不堵塞主线程的执行,达到异步操作的效果。
在Headers中创建mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
//在mythread.h中定义MyThread类, 并继承QThread, 然后把框架写好
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread();
private:
protected:
void run();
signals:
public slots:
};
#endif // MYTHREAD_H
在Sources中创建一个mythread.cpp
#include "mythread.h"
#include "QDebug"
#include "QProcess"
// 构造函数
MyThread::MyThread()
{
}
bool CheckAppRunningStatus(const QString &appName)
{
#ifdef Q_OS_WIN
QProcess* process = new QProcess;
process->start("tasklist" ,QStringList()<<"/FI"<<"imagename eq " +appName);
process->waitForFinished();
QString outputStr = QString::fromLocal8Bit(process->readAllStandardOutput());
if(outputStr.contains(appName)){
return true;
}
else{
return false;
}
#endif
}
void MyThread::run()
{
while (!isInterruptionRequested())
{
// 这里写入你要执行的代码,当没有收到线程结束会一直循环
bool status = CheckAppRunningStatus("PlantsVsZombies.exe");//填入Exe的名字
qDebug() << status;//输出信息到Debug控制台,用于调试
sleep(1);
}
qDebug() << "Get Interruption Request, I'll exit.";
}
在Sources中的mainwindow.cpp创建进程并执行
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDateTime"
#include "QDebug"
//主程序初始化
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个子线程
my_thread = new MyThread; // 实例化
my_thread->start(); // 开启线程
// 关闭线程
// my_thread->requestInterruption();
// my_thread->wait();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_checkBox_2_stateChanged(int arg1)
{
}
void MainWindow::on_sunbtn_stateChanged(int arg1)
{
}
项目目录
运行效果(false是表示植物大战僵尸现在没有运行)