QProcess 在完成前退出

Posted

技术标签:

【中文标题】QProcess 在完成前退出【英文标题】:QProcess exits before complete 【发布时间】:2012-05-31 21:48:52 【问题描述】:

我有一些代码在 QProcess 中启动 mencoder,在显示进度条的同时转换视频,然后退出。问题是,mencoder 总是在它实际完成之前退出。循环运行了几次,然后关闭。如果我注释掉更新进度条的行(progress.setValue()),mencoder 会运行完成并愉快地退出。

搞了一天,搞不懂!另外,我应该提到我在 Mac 上。

有什么想法吗?

谢谢

马龙

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;

【问题讨论】:

【参考方案1】:

我认为 QProcess 在完成其工作之前会超时。添加myProcess-&gt;waitForFinished(-1) 可能会有所帮助。那么你的进程不会超时。

【讨论】:

以上是关于QProcess 在完成前退出的主要内容,如果未能解决你的问题,请参考以下文章

QProcess正常退出

如何使用 Ctrl+C 输入干净地退出 QProcess?

如何在 QProcess 中使用队列?

运行自定义可执行文件,QProcess 立即退出,退出代码为 1

QProcess 退出状态并开始新的

监控正在运行的 qprocess 并在 qprocess 完成时返回值