我计划使用QProcess在我的计算机中执行程序(.exe)并处理已存在的文件,然后输出新文件并继续下一步,整个过程大约需要3到5秒 .
但是,尽管执行该过程的进程屏幕确实显示并运行,并且我还编写了代码行来检测进程是否已完成,然后执行下一步,但仍无法阻止项目执行以下步骤没有等待 .
换句话说,我的项目将尝试打开一个不存在的文件,因为它仍然在前面的代码中处理 .
所以我写了一个简单的代码来测试:
QProcess *proc = new QProcess(this);
ui->textEdit->append(QString("%1").arg(proc->state()));
ui->textEdit->append(QString("%1").arg(proc->exitCode()));
ui->textEdit->append(QString("%1").arg(proc->waitForStarted()));
ui->textEdit->append(QString("%1").arg(proc->waitForFinished()));
proc->startDetached("cmd");
ui->textEdit->append(QString("%1").arg(proc->state()));
ui->textEdit->append(QString("%1").arg(proc->exitCode()));
ui->textEdit->append(QString("%1").arg(proc->waitForStarted()));
ui->textEdit->append(QString("%1").arg(proc->waitForFinished()));
结果都是“零” .
0
0
0
0
0
0
0
0
但是cmd.exe控制台就在那里,
我误解了QProcess的exitcode功能吗?
1 回答
问题是你使用阻塞(非事件循环)
waitFor
方法来解决QProcess
实例上的问题并忘记'APIstartDetached
.如果要编写阻止代码,请使用
start()
启动进程运行,而不是分离版本 .当然对于 生产环境 代码,您可能希望使用信号和事件循环来避免阻塞,但这不是特定问题 .