我正在使用Qt 5.0.2开发一个Windows窗体应用程序。我需要在我的期间调用另一个程序,这是一个控制台应用程序。我想通过命令行或文件传递参数,并通过另一个文件读取期望的结果,但是,由于某些原因,我需要在程序完成其工作并且期望的文件准备好被读取时。
我的流程定义如下:
QProcess *p;
p = new QProcess(this);
QStringList args;
args << "babak" << "Ali" << "Mohsen";
p->execute("ConsoleApplicationCSH.exe" ,args)
我知道我可以使用start
代替execute
,但结果是一样的。我试图通过这段代码检查出来:
while(!p->waitForFinished()){
;
}
exit(1);
编写被调用的方式需要大约10秒来完成它的处理,但是while
循环没有完成。我检查了使用此方法的其他形式和一些类似的方法,但我没有得到任何好结果。
答案 0 :(得分:2)
首先,您需要使用QProcess::start()而不是QProcess::execute(): execute()是一个运行流程的静态方法,并阻塞直到完成。因此,当execute()返回时,该过程已经完成。使用start()不受阻塞地运行该进程。
然后,在GUI代码中,您应该连接到finished()和error()信号,以了解成功终止和错误(如果出现错误,请检查errorString())。
如果在主线程中运行,waitForFinished()会阻止UI,因此通常不希望使用阻塞调用。请注意,waitForFinished()不仅在超时时返回false,而且“如果操作超时,如果发生错误,或者此QProcess已经完成”,则返回false。连接到finished()和error()是检测错误情况的更可靠的方法。如果你真的想以阻塞方式(例如在辅助线程或非GUI程序中),首先调用QProcess::waitForStarted(),以检测甚至无法更干净地启动进程的情况。