С QProcess, необходимо ли вызывать waitForReadyRead после waitForFinished? - PullRequest
0 голосов
/ 24 января 2019

Я использую приведенный ниже код для получения «справки» из стандартного вывода утилиты командной строки. Этот код работал без проблем до сегодняшнего утра, когда кто-то столкнулся с проблемой (появилось окно сообщения, в котором говорилось, что команда выглядит странно).

Я не могу воспроизвести проблему, поэтому я собираюсь объяснить ее аномалией системы, поскольку утилита находится на сетевом общем диске, и у нас есть системы, которые обременены процессами безопасности, которые вызывают большое отставание.

Было бы полезно добавить waitForReadyRead чек, или это избыточно?

Любые мысли или предложения будут оценены.

QProcess cmd_process;
cmd_process.setWorkingDirectory("x:/working/directory");
cmd_process.start(R"(t:\bin\win\cmdlineutility.exe)", QStringList() << "/help");
if(cmd_process.waitForFinished())
{
    // TODO - should waitForReadyRead() go here?
    QByteArray ba = cmd_process.readAll();
    if(ba.contains("something good"))
    {
        // do stuff here
    }
    else
    {
        QMessageBox::information(0, "Something wrong", "cmdlineutility looks odd");
    }
}
else
{
    QMessageBox::information(0, "something wrong", "total fail");
}

1 Ответ

0 голосов
/ 24 января 2019

Хотя бы в qprocess_win.cpp оба QProcessPrivate::waitForReadyRead(int msecs) и QProcessPrivate::waitForFinished(int msecs) выполнить те же действия:

  • 1012 * вызова *

    stdoutChannel.reader && stdoutChannel.reader->waitForReadyRead(0)

  • и когда закончите, позвоните

    drainOutputPipes()

Поэтому, когда возвращается waitForFinished(), все доступные данные будут считаны в выходные буферы.

...