一、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";
});
}
}
Qt执行exe的方法记录
4593

被折叠的 条评论
为什么被折叠?



