Russian Qt Forum
Ноябрь 25, 2024, 19:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProcess: конвейер комманд и индикатор передачи данных  (Прочитано 3919 раз)
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 число "потерь" увеличивается.

« Последнее редактирование: Октябрь 21, 2009, 21:15 от MelkorBSD » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 20.