Russian Qt Forum

Qt => Общие вопросы => Тема начата: MelkorBSD от Октябрь 21, 2009, 14:34



Название: QProcess: конвейер комманд и индикатор передачи данных
Отправлено: MelkorBSD от Октябрь 21, 2009, 14:34
Есть, предположим, следующая команда:
Код:
lzma d -so /tmp/xxx.tar.lzma | tar -xpf - -C /tmp/xxx

В простом случае в Qt это представляется как
Код:
  *Process1 = new QProcess();
  *Process2 = new QProcess();
  Process1->setStandardOutputProcess(Process2);
  Process1->start("lzma d -so /tmp/xxx.tar.lzma");
  Process2->start("tar -xpf - -C /tmp/xxx");
и прекрасно работает.

Стоит задача построить индикатор передачи данных из первого процесса во второй

Строим так:
Код:
  ui->progressBar->setRange(0,1000000000);
  ui->progressBar->setValue(0);
  *Process1 = new QProcess();
  *Process2 = new QProcess();
  Process1->setStandardErrorFile("/tmp/process1.errors");
  Process2->setStandardErrorFile("/tmp/process2.errors");
  Process1->setStandardOutputProcess(Process2);
  connect(Process1,SIGNAL(readyReadStandardOutput()),this,SLOT(MyReadyRead()));
  Process1.start("lzma d -so /tmp/xxx.tar.lzma");
  Process2.start("tar -xpf - -C /tmp/xxx");

А слот для передачи данных содержит следующий код:
Код:
void MainWindow::MyReadyRead()
{
    ReadArray.clear();
    ReadArray += Process1->readAll();
    if (ReadArray.size()>0)
    {
      qint64 BytesWritten = Process2->write(ReadArray.data(),ReadArray.size());
      Process2->waitForBytesWritten();
      ui->progressBar->setValue(ui->progressBar->value()+BytesWritten);
    }
}

Вроде бы это работает, но возникает следующая проблема:

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

Что бы это могло быть и как избежать "потерь"?

PS: При попытке использовать чтение с помощью read вместо readAll число "потерь" увеличивается.