У меня очень простое использование 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
, но ошибок не было.