Есть, предположим, следующая команда:
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 число "потерь" увеличивается.