2016-08-23 13 views
1

実行中にQProcessの出力を取得する必要があります。Qt:実行中のQProcessのライブ出力を取得する方法

CommandExecutor_C::CommandExecutor_C(): 
    mProcessStatus(AI_UNKNOWN), 
    mOnTdiActiveCallback(), 
    mTdiProcess(new QProcess) 
{ 
    connect(mTdiProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(CheckOutput())); 
    connect(mTdiProcess, SIGNAL(readyReadStandardError()), this, SLOT(CheckOutput())); 
} 

void CommandExecutor_C::ExecuteCommand(QString &aCommand) 
{ 
    mTdiProcess->start(aCommand, QProcess::Unbuffered | QProcess::ReadWrite); 
    LOGINFO(FB_TDI,"Launch command: " + aCommand.toStdString()); 
} 


void CommandExecutor_C::CheckOutput() 
{ 
    QString StdOut = QString(mTdiProcess->readAllStandardOutput()); 
    QString StdErr = QString(mTdiProcess->readAllStandardError()); 

    mProcessStatus = CheckTdiAutomationInterface(StdOut.toStdString(), StdErr.toStdString()); 

    if(mProcessStatus != AI_UNKNOWN) 
    { 
     OnTdiActive(mProcessStatus); 
    } 
} 

QProcessが終了します場合、これは正常に動作しますが、私の場合の処理​​は、恒久的にバックグラウンドで実行する必要がありますオートメーションインターフェイスを開始します。したがって、私は、次のコードを書かれています。したがって、私は "readyReadStandardOutput"を使用してスロットCheckOutput()に接続しました。 CheckOutput()は、プロセスが終了したときに呼び出されます。そうでなければ、私は無限に待っています。

私はこの問題について多くのことを尋ねましたが、何も機能しませんでした。私は出力がバッファリングされていることを確信しており、プロセスが終了した場合にだけ戻ります。したがって私はUnbuffered-Modeでプロセスを開始しました。また、mTdiProcessのチャンネルを転送しようとしました。ここにコード:

void CommandExecutor_C::ExecuteCommand(QString &aCommand) 
{ 
    mTdiProcess->setProcessChannelMode(QProcess::ForwardedChannels); 
    mTdiProcess->start(aCommand, QProcess::Unbuffered | QProcess::ReadWrite); 
    LOGINFO(FB_TDI,"Launch command: " + aCommand.toStdString()); 
} 

何も働いていません。あなたが私を助けることを願っています。

Qt 5.4.2を使用しています。重要です。

+0

'readyReadStandardOutputは()'のようです。このような状況に放出されていないようですので、たぶん、あなたは信号 'のstateChanged()'に固執する必要がありますドキュメンテーションに関して正しいものであること。より頻繁に報告する 'QProcess'が必要な場合は、' QProcess'から継承した独自のプロセスクラスを作成してください。これは私が考える正しい方法でしょう。 – maxik

+0

実行中の実際のプロセス( 'QProcess'オブジェクトによって管理されている)が標準出力をバッファリングしている可能性もあります。それは起こっていないと確信していますか? – bnaecker

+0

"より頻繁にレポートするQProcessが必要な場合は、QProcessから継承する独自のプロセスクラスを作成してください。" @maxik – Lehtim

答えて

1

私は通常、このような定期的な間隔で出力を確認してください。

bool returnBool = false; 
while (returnBool == false) 
{ 
    /*! Wait one second if the process finishes. Then read all output to 
    * stdout and stderr and redo. */ 
    returnBool = process.waitForFinished(1000); 
    QString outputStdOut = process.readAllStandardOutput(); 
    QString outputStdErr = process.readAllStandardError(); 
} 
+0

私は似たようなことをやってみましたが、私の場合はうまくいきませんでした。それは同期的ではないのですか?私は何も受け取られていない間GUIがフリーズすることをお勧めします。 QProgressDialogを使用しているので、信号とスロットを使用するほうがずっと優れています(バーは待機中に左から右へ移動します)。 – Lehtim

+0

あなたは正しいです、それは同期的です。このコードをGUIスレッドから実行すると、そのコードはフリーズします。シグナルが機能するなら、それらを使用することはもちろんもちろんです... – Sebastian

関連する問題