记录qt执行exe的方法

Qt执行exe的方法记录

一、system直接执行(多个exe的时候不建议)

用法:

 system("D:/GlassesTesting/1.exe");
 system("D:/Testing/2.exe");
 system("D:/Glasses/3.exe");

这样使用的话,就会出现:1被打开,2、3都不出来;关闭1, 2才出来。 关闭2, 3才出来。

chatgpt的解释如下:使用 system(“X.exe”) 时,它实际上是同步调用的命令。这意味着它会等到前一个命令执行完毕,才会执行下一个。因此,导致每个程序都是逐个打开的,并且程序的主线程被阻塞。

二、推荐使用QProcess类

QProcess 可以启动外部程序而不会阻塞主程序的执行,这样可以在异步的方式下启动多个 EXE 程序。

为适应业务需求,这里在启动exe之前,首先检查这些exe是否已经在运行了。如果已在运行,先关闭;再打开。

// 启动程序总代码
void ProgramStartup::startPrograms()
{
      readConfigFile();
      checkExes();
      ExecuteExes();
}

其中readConfigFile()为获取exe路径集合exePaths;checkExes()为检查exes是否已在运行;ExecuteExes()为执行exes。

void ProgramStartup::checkExes(){
    // 检查是否有程序已经在运行,如果有则杀掉
    foreach (const QString &exePath, exePaths) {
        QFileInfo exeInfo(exePath);
        QString exeName = exeInfo.fileName(); // 获取可执行文件的名称

        // 检查进程是否在运行
        QProcess checkProcess;
        checkProcess.start("tasklist", QStringList() << "/FI" << ("IMAGENAME eq " + exeName));
        checkProcess.waitForFinished();
        QString output = checkProcess.readAllStandardOutput();

        // 如果找到正在运行的进程,杀掉
        if (output.contains(exeName, Qt::CaseInsensitive)) {
            qDebug() << "检测到程序已在运行,正在杀掉: " << exeName;
            int exitCode = QProcess::execute("taskkill", QStringList() << "/IM" << exeName << "/F");
            if (exitCode != 0) {
               qDebug() << "关闭程序失败: " << exeName << ",更新关闭信号寄存器为 2";

               // 调用 updatePLCRegisters,将关闭信号寄存器设置为 2
               updatePLCRegisters(stopSignalRegister, 2, []() {
                   qDebug() << "程序关闭失败!关闭信号寄存器已更新为 2";
               });
           } else {
               qDebug() << "成功关闭程序: " << exeName;
           }
        }
    }
}

// 执行exe
void ProgramStartup::ExecuteExes(){
    // 遍历路径列表并执行 exe
    foreach (const QString &exePath, exePaths) {
        qDebug() << "执行: " << exePath;
        QProcess *process = new QProcess(this);
        process->start(exePath);

        if (!process->waitForStarted()) {
            qWarning() << "Error: " << process->errorString();
            updatePLCRegisters(startSignalRegister, 2, [exePath]() {
                qDebug() << exePath << "程序启动失败!启动信号寄存器已更新为 2";
            });
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值