2012-06-25 38 views
1

我想借助一些外部程序來優化圖像。程序必須一個接一個地執行,其中一些取決於最後一個程序的輸出,其中一些取決於圖像的特徵。如何在不凍結gui的情況下運行QProcess的同步鏈?

我知道,我可以使用信號,但這在這裏並不是很有用,因爲我必須爲每個外部程序使用幾十個函數和信號,其中一些函數和信號根據位置而定,甚至多次一個程序被稱爲鏈中。逐一執行它們會更容易。但是如果我這樣做,即使沒有顯示狀態消息,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)) 
    ; 
+0

線程會做。順便說一句,你可以創建一個插槽,比如'on_qprocess_done',準備好命令列表(或者直接生成它們),並用它來代替簡單的阻塞線性算法。 – elmigranto

回答

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() 
{ 
    [...] 
} 

Alternativly你可以調用processEvents在QApplication的,而你正在等待或做整個事情在不同的QThread。

+0

調用'QCoreApplication :: processEvents();'保存了我的一天。謝謝! – Oliver

0

創建工作線程(若有線程,如果需要並行處理)並在那裏等待。那麼GUI不會被阻塞。

相關問題