1

いくつかの外部プログラムの助けを借りて画像を最適化したいと考えています。プログラムは 1 つずつ実行する必要があり、一部は最後のプログラムの出力に依存し、一部は画像の特性に依存します。

シグナルを使用できることはわかっていますが、ここではあまり役に立ちません。外部プログラムごとに数十の関数とシグナルを使用する必要があり、プログラムが呼び出される位置によっては複数回使用するものもあります。チェーンで。それらを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

この場合、シグナルを使用するのが「正しい」方法です。それらを連鎖させるだけです。

[...]
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 に答える