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

时间:2018-10-25 20:48:22

标签: qt multiprocessing stdout qprocess

我对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信号,但是没有错误。

1 个答案:

答案 0 :(得分:0)

这可能与QTBUG-67744有关,与QProcess和stdout管道有关。

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