Qt QProcess прерывистая ошибка чтения stdout - PullRequest
0 голосов
/ 25 октября 2018

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

1 Ответ

0 голосов
/ 26 октября 2018

Это, вероятно, связано с QTBUG-67744 , связанным с QProcess и каналами stdout.

Обновление до Qt 5.11.2 решило проблему на зараженной машине.

...