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