Qt QProcess 间歇性读取标准输出失败

Qt QProcess intermittent failure to read stdout

我对 QProcess 有一个非常简单的用法:

void MainWindow::startPing()
{
    auto p = new QProcess(this);

    connect(p, &QProcess::readyReadStandardOutput, this, &MainWindow::procStdout);
    connect(p, static_cast<void(QProcess::*)(int)>(&QProcess::finished), this, &MainWindow::procFinished); // workaround for overloaded 'finished' name

    p->start("C:\windows\system32\ping.exe", "127.0.0.1");
}

void MainWindow::procStdout()
{    
    ui->textEdit->append("readyReadStandardOutput");
    auto msg = p->readAllStandardOutput();
    ui->textEdit->append(QString::fromUtf8(msg));
}

void MainWindow::procFinished()
{
    ui->textEdit->append("finished");
}

子进程每隔几秒打印几行标准输出,然后关闭。 (示例使用的 Ping;我有另一个应用程序,我需要读取它的标准输出)

此代码已在数千台机器上 100% 地运行。但最近我发现一台 PC 真的非常不可靠。

在这台受影响的机器上,第一次 你在 Qt 应用程序中 运行 这段代码时,ping.exe 出现在任务管理器中;但是没有readyReadStandardOutput信号发出。最终发出 finished 信号。

如果您再尝试 2-5 次,它有时有效,有时无效。

大约第 5 次后它就完全可靠了。

该问题还影响 QProcess 的同步使用(即 QProcess::waitForReadyRead)。

上面的代码是否有问题导致了这个问题?或者这可能是由 Qt 错误 (5.6 LTS) 引起的?或者受影响的 PC 是否有任何可能的方面可以解释这种行为?

我尝试通过 Qt::QueuedConnectionQt::DirectConnection 连接信号,结果没有变化。 我也尝试连接到 stderr 和 QProcess::errorOccurred 信号,但没有错误。

这可能与 QTBUG-67744 有关,与 QProcess 和标准输出管道有关。

升级到 Qt 5.11.2 解决了受影响机器上的问题。