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::QueuedConnection
和 Qt::DirectConnection
连接信号,结果没有变化。
我也尝试连接到 stderr 和 QProcess::errorOccurred
信号,但没有错误。
这可能与 QTBUG-67744 有关,与 QProcess 和标准输出管道有关。
升级到 Qt 5.11.2 解决了受影响机器上的问题。
我对 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::QueuedConnection
和 Qt::DirectConnection
连接信号,结果没有变化。
我也尝试连接到 stderr 和 QProcess::errorOccurred
信号,但没有错误。
这可能与 QTBUG-67744 有关,与 QProcess 和标准输出管道有关。
升级到 Qt 5.11.2 解决了受影响机器上的问题。