Qt:如何获取正在运行的 QProcess 的实时输出

Leh*_*tim 5 c++ 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果 QProcess 完成,则效果很好,但在我的情况下,进程启动一个自动化界面,该界面应永久在后台运行。因此,我使用了“readyReadStandardOutput”并将其连接到插槽 CheckOutput()。如果该过程已完成,则会调用 CheckOutput()。不然我就是无休无止的等待。

我用谷歌搜索了很多关于这个问题的信息,但没有任何效果。我非常确定输出正在缓冲,并且如果进程完成则只会返回。因此,我以无缓冲模式启动了该进程。我还尝试转发 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());
}
Run Code Online (Sandbox Code Playgroud)

但没有任何效果。我希望你可以帮助我。

如果这很重要的话,我正在使用 Qt 5.4.2。

小智 4

我通常定期检查输出,如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)