2012-05-31 2 views
1

У меня есть код, который запускает mencoder в QProcess, преобразует видео, пока отображается индикатор выполнения, а затем выходит. Проблема в том, что mencoder всегда выходит, пока он не закончен. Цикл пробегает несколько раз, а затем закрывается. Если я закомментирую строку, которая обновляет индикатор выполнения (progress.setValue()), mencoder завершает работу и успешно завершает работу.QProcess выходит до завершения

Был на этом целый день, и он не может понять это! Кроме того, я должен упомянуть, что я нахожусь на Mac.

Любые идеи?

Благодаря

Marlon

void MainWindow::convertVideo() 
{ 
    QString input_filename = "/var/input.avi"; 
    QString output_filename = "/var/output.264"; 

    QStringList arguments; 
    arguments << input_filename << "-nosound" << "-of" << "rawvideo" << "-ofps" << "30" << "-vf" << "harddup" << "-ovc" << "x264" << "-x264encopts" << "bframes=0" << "-o" << output_filename; 

    QProcess* myProcess = new QProcess(this); 
    myProcess->setReadChannel(QProcess::StandardOutput); 

    myProcess->start("/opt/local/bin/mencoder", arguments); 

    QString output_string; 
    QStringList output_pieces; 

    QProgressDialog progress("Converting video...", "Abort", 0, 100, this); 
    progress.setWindowModality(Qt::WindowModal); 
    progress.setValue(0); 
    progress.show(); 


    while(myProcess->state() != QProcess::NotRunning) 
    { 
     output_string = myProcess->readAllStandardOutput(); 

     output_pieces = output_string.split(" "); 
     QStringList width_string_list = output_pieces.filter("%)"); 
     if(width_string_list.length() > 0) 
     { 
      width_string_list = width_string_list[width_string_list.length() - 1].split("("); 
      if(width_string_list.length() > 1) 
      { 
       width_string_list = width_string_list[1].split("%"); 
      } 
      else 
      { 
       width_string_list = width_string_list[0].split("%"); 
      } 

      progress.setValue(width_string_list[0].toInt()); 

      qDebug() << width_string_list[0].toInt(); 

     } 

     myProcess->waitForReadyRead(); 
    } 

    return; 
} 

ответ

0

Я думаю, что QProcess ауты, прежде чем он закончит свою работу. Добавление myProcess->waitForFinished(-1) может помочь. Тогда ваш процесс не будет тайм-аут.

Смежные вопросы