如何在不冻结gui的情况下运行QProcess的同步链?

时间:2012-06-25 15:10:19

标签: qt freeze synchronous qprocess

我想借助一些外部程序优化图像。程序必须一个接一个地执行,其中一些程序取决于最后一个程序的输出,其中一些程序取决于图像的特征。

我知道,我可以使用信号,但这在这里不是很有用,因为我必须为每个外部程序使用几十个函数和信号,其中一些甚至多次取决于位置,其中a程序在链中被调用。逐个执行它们会容易得多。但是,如果我这样做,即使没有显示状态消息,gui也会立即冻结,直到所有进程完成。我还能做什么?

ui->status->setText("Do something with program 1");

QProcess *proc1 = new QProcess;
proc1->setReadChannelMode(QProcess::SeparateChannels);
proc1->start("program 1 -args", QIODevice::ReadWrite);

while(!proc1->waitForFinished(10))
    ;

ui->status->setText("Do something with program 2");

QProcess *proc2 = new QProcess;
proc2->setReadChannelMode(QProcess::SeparateChannels);
proc2->start("program 2 -args", QIODevice::ReadWrite);

while(!proc2->waitForFinished(10))
    ;

2 个答案:

答案 0 :(得分:3)

在这种情况下,使用信号是"正确"办法。你只需要链接它们。

[...]
ui->status->setText("Do something with program 1");
proc1.setReadChannelMode(QProcess::SeparateChannels);
proc1.start("program 1 -args", QIODevice::ReadWrite);
connect(proc1, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishedProc1()))
[...]

void finishedProc1()
{
   ui->status->setText("Do something with program 2");
   proc2.setReadChannelMode(QProcess::SeparateChannels);
   proc2.start("program 2 -args", QIODevice::ReadWrite);
   connect(proc2, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishedProc2()))
}

void finishedProc2()
{
  [...]
}

另外,您可以在等待时调用QApplication中的processEvents,或者在不同的QThread中执行整个操作。

答案 1 :(得分:0)

创建工作线程(如果需要并行处理,可以使用多个线程)并在那里等待。 GUI不会被阻止。