2012-05-29 3 views
1

다음 QProcess를 실행하는 스레드가 여러 개 있습니다. 무작위로 그들은 오류 상태 5로 실패합니다. Qt 문서는 더 이상의 세부 사항을 제공하지 않습니다. 누구든지 그 오류가 무엇으로부터 왔는지 실마리가 있습니까? 고맙습니다.QProcess 오류 상태 5의 이유는 무엇입니까?

문제에 대한 접선
finishing failed error= 5 "Unknown error" 
+1

오류 코드 5가 기본 오류 코드입니다. 호출하는 프로세스가 QProcess가 아니라 실패 할 수 있습니까? – cmannett85

+0

cmd와 args의 의미는 무엇입니까? 또한 넣어주십시오 – ScarCode

+0

안녕하세요. 명령과 매개 변수 내용을 추가했습니다. – spikey

답변

4

당신이 하지 각 프로세스 당 스레드를 시작해야한다는 사실은 다음과 같습니다

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()을 발급합니다. 모든 3 개의 신호를 QObject의 슬롯에 연결 한 다음 프로세스를 시작하고 슬롯의 결과를 처리합니다. 추가 스레드가 필요하지 않습니다. 당신이 started() 신호를 받으면

는, 당신은 프로세스의 파일 이름이 올바른지, 그리고 프로세스가 시작되었다는 것을 확신 할 수 있습니다. finished(int)에서 얻은 종료 코드가 무엇이든지간에 프로세스가 수행 한 것을 나타내며 잠재적으로 잘못된 인수에 대한 응답으로 전달되었을 수 있습니다. error() 신호를 받으면 QProcess::start()에 잘못된 파일 이름을 지정했거나 올바른 권한이 없기 때문에 프로세스를 시작하지 못했습니다.

당신은 일이 비동기 적으로 발생 동기 코드를 작성하지 않아야합니다. 동기 코드는 waitForCmdFinished을 호출하는 것과 같은 특정 일이 일어나지 않도록 차단하는 코드입니다. Qt 3 지원 API를 비활성화/활성화하는 플래그처럼 모든 잔여 동기 차단 API를 비활성화하는 Qt 구성 플래그가 있었으면합니다. 이러한 블로킹 API의 단순한 가용성은 위의 코드와 같은 끔찍한 해킹을 조장합니다. 이러한 API는 기본적으로 IMHO로 사용 중지해야합니다. 마찬가지로 QThread와 파생 된 클래스를 다른 스레드로 옮기는 테스트가 있어야합니다. 또한 공개적으로 사용할 수있는 코드의 모든 예에서 잘못된 디자인의 표시이기도합니다. 나는 완전히 미친 듯이 자신을 설득하기 위해 철저한 검색을 수행했습니다.

내가 Qt를에서 waitxxx 방법에 대한 기억 유일한 합리적인 사용

는 QThread가 완료 될 때까지의 대기입니다. 그럼에도 불구하고, 이것은 ~QThread 안에서만 호출되어야합니다. 그래야 실행중인 트레드로 QThread가 파괴되는 것을 방지 할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 직접 질문이 없기 때문에 질문에 대한 대답으로 선택했습니다. 대답.나는 다른 접근법을 시도했다. 첫째, 다중 스레드 응용 프로그램에서 QProcess를 사용하려면 _blocking_ (synchronous) 코드를 피하는 것이 필수가되었습니다. 둘째, 다른 스레드와 독립적으로 큐를 처리하여 모든 요청을 처리하는 단일 스레드를 만들었습니다. – spikey