我需要在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,如果这很重要的话。
stateChanged()
,因为根据文档,这种情况下似乎不会触发readyReadStandardOutput()
信号。如果你想要一个更频繁报告的QProcess
,可以创建一个继承自QProcess
的自定义进程类,我认为这是正确的做法。 - maxikQProcess
对象管理)也在缓冲其标准输出。你确定这不是发生的情况吗? - bnaecker