检测进程已在Qt中完成

时间:2014-01-26 06:44:41

标签: c++ qt multiprocessing qprocess

我正在使用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循环没有完成。我检查了使用此方法的其他形式和一些类似的方法,但我没有得到任何好结果。

1 个答案:

答案 0 :(得分:2)

首先,您需要使用QProcess::start()而不是QProcess::execute(): execute()是一个运行流程的静态方法,并阻塞直到完成。因此,当execute()返回时,该过程已经完成。使用start()不受阻塞地运行该进程。

然后,在GUI代码中,您应该连接到finished()error()信号,以了解成功终止和错误(如果出现错误,请检查errorString())。

如果在主线程中运行,waitForFinished()会阻止UI,因此通常不希望使用阻塞调用。请注意,waitForFinished()不仅在超时时返回false,而且“如果操作超时,如果发生错误,或者此QProcess已经完成”,则返回false。连接到finished()和error()是检测错误情况的更可靠的方法。如果你真的想以阻塞方式(例如在辅助线程或非GUI程序中),首先调用QProcess::waitForStarted(),以检测甚至无法更干净地启动进程的情况。