2012-05-29 76 views
1

我有多个线程运行以下QProcess。随机地他们失败,出现错误状态5. Qt文档没有提供任何更多细节。有没有人知道这个错误可能来自哪里?非常感谢你。QProcess错误状态5的原因是什么?

extCmd = new QProcess(this); 

QString cmd = "/usr/bin/php"; 
QStringList argStr; 
argStr << "/bin/sleep" << "10"; // changed to ever working command 
extCmd->start(cmd, args); 
bool suc = extCmd->waitForFinished(-1); 
if (!suc) { 
    qDebug() << "finishing failed error=" 
      << extCmd.error() 
      << extCmd.errorString(); 
} 

给我的输出:

finishing failed error= 5 "Unknown error" 
+1

错误代码5是默认的错误代码,可能是您正在调用的进程失败而不是QProcess? – cmannett85

+0

什么在cmd和参数?把那也 – ScarCode

+0

嗨,谢谢你看看。我添加了命令和参数内容。 – spikey

回答

4

切到你的问题是事实,你应该首发每个每个进程中的线程。 QProcess在完成时发出一个finished(int code, QProcess::ExitStatus status)信号。它也将分别在成功和不成功的启动时发出started()error()。将所有这三个信号连接到QObject中的一个插槽,然后启动该过程并处理插槽中的结果。你不需要任何额外的线程。

如果您收到started()信号,那么您可以确定该进程的文件名是正确的,并且该进程已启动。无论您从finished(int)得到的退出代码是否表明该过程的作用,可能是为了回应您可能已传递给它的潜在无效论点。如果您收到error()信号,则该过程无法启动,因为您给QProcess::start()指定了错误的文件名,或者您没有正确的权限。

你不应该写异步发生异步的代码。同步代码是阻止特定事情发生的代码,如调用waitForCmdFinished。我希望有一个Qt配置标志禁用所有剩下的同步阻塞API,就像有一个禁用/启用Qt 3支持API的标志一样。这些阻止API的可用性促使像上面的代码那样可怕的黑客入侵。这些API应该默认禁用恕我直言。就像应该将QThread和派生类移动到另一个线程一样。这也是我可以找到的每个公开可用代码示例中的糟糕设计的标志,而且我做了相当彻底的搜索以说服自己,我没有发疯或什么。

我记得Qt中waitxxx方法唯一合理的用法就是等待QThread完成。即使如此,也只能在~QThread之内调用,以防止QThread在踏面仍在运行时被破坏。

+0

谢谢你的回应,我选择它作为我的问题的答案,因为没有直接的回答。我尝试了不同的方法。首先,为了在多线程应用程序中使用QProcess,避免_blocking_(同步)代码已成为必须。其次,我创建了一个单独的线程,通过独立于其他线程处理队列来处理所有请求。 – spikey

相关问题