1

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

我知道,我可以使用信号,但这在这里不是很有用,因为我必须为每个外部程序使用几十个函数和信号,其中一些甚至多次取决于调用程序的位置在链中。一个一个地执行它们会容易得多。但是,如果我这样做,即使在所有进程完成之前不显示状态消息,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))
    ;
4

2 回答 2

3

在这种情况下,使用 Signals 是“正确”的方式。你只需要链接它们。

[...]
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 中执行整个操作。

于 2012-06-25T15:27:42.833 回答
0

创建工作线程(几个线程,如果您需要并行处理)并在那里等待。GUI 将不会被阻止。

于 2012-06-25T15:24:31.603 回答