2013-06-03 86 views
0

我有兩個函數的時間計算是相同的。第一個需要大約2秒鐘來顯示結果。第二個是一樣的。使用Qt的同步信號

但是,當我顯示不同的結果,這需要時間的計算的總和,使結果被並行地在4秒內(併爲每個未2秒)

QTimer* timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(capture())); 
connect(timer, SIGNAL(timeout()), this, SLOT(capture_2())); 
timer->start(0); 
顯示(用於兩個功能)

如何建立一個呼叫,使其在2秒內工作?

+0

你使用線程嗎?如果這些函數在同一個線程中,它們不會並行執行,而是按順序執行。 – AquilaRapax

+0

我沒有使用線程。我可以使用OpenMP嗎? –

+0

你可以,但你不必。既然你使用Qt,你也可以使用QThreads,我會推薦它。 – AquilaRapax

回答

1

我會創建一對新員工,將他們鏈接到QThreads並將您的信號連接到每個工人的插槽。訣竅是通過標誌Qt :: QueuedConnection來連接,所以這兩個線程同時進行調用。別擔心,這不會產生兩秒鐘的開銷。

class Worker1 : public QObject 
{ 
Q_OBJECT; 
public slots: 
    void capture(void); 
} 

class Worker2 : public QObject 
{ 
Q_OBJECT; 
public slots: 
    void capture(void); 
} 


void setup(void) 
{ 
Worker1 * w1 = new Worker1; 
Worker2 * w2 = new Worker2; 

QThread * t1 = new QThread(w1); 
QThread * t2 = new QThread(w2); 

w1->moveToThread(t1); 
w2->moveToThread(t2); 

t1->start(); 
t2->start(); 

QTimer* timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), w1, SLOT(capture()), Qt::QueuedConnection); 
connect(timer, SIGNAL(timeout()), w2, SLOT(capture()), Qt::QueuedConnection); 
timer->start(0); 
} 

聲明:我在現場編了這段代碼,可能需要一些波蘭語,但我希望你明白我的意思。

+0

'這不會產生兩秒的開銷。「爲什麼? Qt是否優化線程的創建?用線程池也許?只是出於好奇而問。 –

+0

@ AdriC.S。我忘記添加對QThread :: start的調用。現在應該清楚了;線程已經運行並處於等待狀態。信號只會喚醒它們。 –