2016-10-25 3 views
0

q 프로세스 (프로그램 adb)를 실행하고 프로세스가 끝나면 결과를 호출 함수로 반환하십시오. 그러나 adb가 루프에서 스스로를 찾을 수있는 모든 가능성이 있습니다. "ADB 서버는 ACK가 아닙니다"와 같은 오류 메시지를 표준 출력으로 인쇄합니다. 나는이 오류들을 잡아야한다.q 프로세스가 실행 중일 때 모니터가 실행되고 q 프로세스가 완료되면 반환 값

QProcess run_command; 
    connect(&run_command,SIGNAL(readyReadStandardOutput()),this,SLOT(dolog()));  
    QString result=RunProcess("adb connect 192.168.1.100"); 

    ... 

    QString MainWindow::RunProcess(QString cstring) 
    { 

    run_command.start(cstring); 

     // keep gui active for lengthy processes.      

     while(run_command.state() != QProcess::NotRunning) 
      qApp->processEvents(); 

     QString command=run_command.readAll(); 
     return command; // returns nothing if slot is enabled. 
    } 

    void MainWindow::dolog() 
     { 
      QString logstring = run_command.readAllStandardOutput(); 
       if (logstring.contains("error condition") 
       logfile("Logfile:"+logstring); 

     } 

나는 로그 파일에 표준 출력 신호/슬롯, 도로 그() 인쇄를 가능하게하지만, RunProcess 빈 문자열을 반환합니다. 신호/슬롯을 사용하지 않으면 RunProcess()가 qprocess 출력을 예상대로 반환합니다.

+5

'processEvents()'가 존재한다는 사실을 잊어 버리십시오. 잘못 사용 된 시간의 99 %는 여기에 해당됩니다. 한 번이라도 호출하지 않는 수십만 줄의 완벽한 응용 프로그램을 작성할 수 있습니다. 프로세스를 실행하여 출력을 얻으려면 프로세스의 관련 신호에 하나 이상의 슬롯을 연결해야합니다. 또한'readAllStandardOutput'을 사용하지 않고'while (run_command.canReadLine()) {auto line = run_command.readLine();을 실행하여 각 행을 개별적으로 처리합니다. ...}' –

답변

0

먼저 해당 명령이 오류를 위해 사용중인 출력 스트림을 식별해야합니다. stderr과 매우 비슷하므로 readyReadStandardError() 신호에 대신 연결해야합니다.

명령 자체의 경우 명령과 인수로 나누고 명령과 인수 목록을 사용하는 QProcess::start() 오버로드를 사용하는 것이 좋습니다. 정확하게 다시 분리되는 단일 문자열에 의존하는 것보다 훨씬 강력합니다.

관련 문제