実行中に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を使用しています。重要です。
'readyReadStandardOutputは()'のようです。このような状況に放出されていないようですので、たぶん、あなたは信号 'のstateChanged()'に固執する必要がありますドキュメンテーションに関して正しいものであること。より頻繁に報告する 'QProcess'が必要な場合は、' QProcess'から継承した独自のプロセスクラスを作成してください。これは私が考える正しい方法でしょう。 – maxik
実行中の実際のプロセス( 'QProcess'オブジェクトによって管理されている)が標準出力をバッファリングしている可能性もあります。それは起こっていないと確信していますか? – bnaecker
"より頻繁にレポートするQProcessが必要な場合は、QProcessから継承する独自のプロセスクラスを作成してください。" @maxik – Lehtim