Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading QProcess错误状态5的原因是什么?_Multithreading_Qt_Qprocess - Fatal编程技术网

Multithreading QProcess错误状态5的原因是什么?

Multithreading QProcess错误状态5的原因是什么?,multithreading,qt,qprocess,Multithreading,Qt,Qprocess,我有多个线程运行以下QProcess。它们随机失败,错误状态为5。Qt文档没有给出更多细节。有人知道那个错误是怎么来的吗?多谢各位 extCmd = new QProcess(this); QString cmd = "/usr/bin/php"; QStringList argStr; argStr << "/bin/sleep" << "10"; // changed to ever working command extCmd->start(cmd, arg

我有多个线程运行以下QProcess。它们随机失败,错误状态为5。Qt文档没有给出更多细节。有人知道那个错误是怎么来的吗?多谢各位

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();
}

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

如果收到
started()
信号,则可以确保进程的文件名正确,并且进程已启动。无论您从
finished(int)
中得到什么退出代码,都会指示该进程做了什么,可能是为了响应您可能传递给它的潜在无效参数。如果收到
error()
信号,则进程无法启动,因为您为
QProcess::start()
提供了错误的文件名,或者您没有正确的权限

您不应该在异步发生的情况下编写同步代码。同步代码是阻止特定事件发生的代码,如调用
waitForCmdFinished
。我希望有一个Qt配置标志可以禁用所有剩余的同步阻塞API,就像有一个标志可以禁用/启用Qt3支持API一样。仅仅是这些拦截API的可用性就促进了像上面代码那样可怕的黑客行为。默认情况下,IMHO应禁用这些API。正如应该有一个将QThread和派生类移动到另一个线程的测试一样。在我能找到的每一个公开代码示例中,这也是糟糕设计的标志,我做了一次相当彻底的搜索,以说服自己我不是疯子或其他什么


我记得Qt中
waitxxx
方法的唯一合理用法是等待QThread完成。即使如此,这也只能从
~QThread
内部调用,以防止在踏板仍在运行的情况下破坏QThread。

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

如果收到
started()
信号,则可以确保进程的文件名正确,并且进程已启动。无论您从
finished(int)
中得到什么退出代码,都会指示该进程做了什么,可能是为了响应您可能传递给它的潜在无效参数。如果收到
error()
信号,则进程无法启动,因为您为
QProcess::start()
提供了错误的文件名,或者您没有正确的权限

您不应该在异步发生的情况下编写同步代码。同步代码是阻止特定事件发生的代码,如调用
waitForCmdFinished
。我希望有一个Qt配置标志可以禁用所有剩余的同步阻塞API,就像有一个标志可以禁用/启用Qt3支持API一样。仅仅是这些拦截API的可用性就促进了像上面代码那样可怕的黑客行为。默认情况下,IMHO应禁用这些API。正如应该有一个将QThread和派生类移动到另一个线程的测试一样。在我能找到的每一个公开代码示例中,这也是糟糕设计的标志,我做了一次相当彻底的搜索,以说服自己我不是疯子或其他什么


我记得Qt中
waitxxx
方法的唯一合理用法是等待QThread完成。即使如此,这也只能从
~QThread
内部调用,以防止在tread仍在运行的情况下破坏QThread。

错误代码5是默认错误代码,可能是您调用的进程失败而不是QProcess吗?cmd和args中有什么内容?也请注意,谢谢您查看。我添加了命令和参数内容。@cbamber85好的开始点:我将命令更改为总是有效的
/bin/sleep 10
。现在,我看到
waitForFinished()
的参数没有效果:-1和20000总是失败。这怎么可能?Ups。很抱歉,我在日志分析中犯了一个错误,只有百分之几失败。错误代码5是默认错误代码,可能是您调用的进程失败了而不是QProcess?cmd和args中有什么?也请说出来,谢谢您查看。我添加了命令和参数内容。@cbamber85好的开始点:我将命令更改为总是有效的
/bin/sleep 10
。现在,我看到
waitForFinished()
的参数没有效果:-1和20000总是失败。这怎么可能?Ups。很抱歉,我在日志分析中犯了一个错误,只有百分之几失败。谢谢你的回答,我选择它作为我问题的答案,因为没有直接的答案。我尝试了不同的方法。首先,在多线程应用程序中使用QProcess时,必须避免阻塞(同步)代码。第二,我创建了一个单独的线程,通过独立于其他线程处理队列来处理所有请求。我尝试了不同的方法。首先,避免阻塞(同步)代码已成为在应用程序中使用QProcess的必要条件
finishing failed error= 5 "Unknown error"