У меня очень простое использование 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% времени на тысячах машин. Но недавно я нашел один компьютер, на котором он действительно очень ненадежный.
На этой затронутой машине, первый, когда вы запускаете этот код в приложении Qt, ping.exe появляется в диспетчере задач; но сигналы readyReadStandardOutput
не излучаются. В конце концов издается сигнал finished
.
Если попробовать еще 2-5 раз, иногда работает, иногда нет.
Примерно после 5-го раза это совершенно надежно.
Проблема также затрагивает синхронное использование QProcess (например, QProcess::waitForReadyRead
).
Что-то не так с приведенным выше кодом, что могло вызвать это? Или это может быть вызвано ошибкой Qt (5.6 LTS)? Или есть какой-либо возможный аспект пораженного ПК, который мог бы объяснить такое поведение?
Я попытался подключить сигналы от Qt::QueuedConnection
и Qt::DirectConnection
, но результат не изменился.
Пытался подключиться к сигналам stderr и QProcess::errorOccurred
, но ошибок не было.
Вероятно, это связано с QTBUG-67744, связанным с конвейерами QProcess и stdout.
Обновление до Qt 5.11.2 разрешило проблему на затронутой машине.