2013-01-04 87 views
0

我正在壓縮視頻,未來我想一次壓縮多個幀。我有一個線程,我稱它爲每個框架上的工作 - 這就是爲什麼我有我的UI類循環。問題在於UI被阻止。爲什麼?這是因爲我是從for循環調用線程嗎?從循環塊開始線程UI

代碼導致UI塊(Dialog.cpp):

for(int i=0; i<nFrames; i++) 
{ 
    //grab next frame from video source 

    myThread.setFrame(newFrame); 
    myThread.start(); 
    myThread.wait(); 
    result.append(myThread.GetResult()); 
} 
+4

開始一個單獨的線程,並立即等待它有什麼意義? –

+0

我使用了wait(),因爲沒有它,線程將立即通過for循環重新啓動,不會產生任何結果。這不正確嗎? –

+2

問題是,如果您立即阻止等待線程完成,線程中根本沒有任何指向。您的單個線程化UI會阻塞並屈服到第二個線程,並繼續屈服,直到第二個線程中的任務完成。在這種情況下,你可以完成工作的主線程。你不能像這樣在循環中創建一個線程。您可能想要使用信號和插槽,QtConcurrent或線程池來完成此任務,但我沒有時間來解釋這兩種解決方案。 – drescherjm

回答

7

你打電話wait,你爲什麼會想到wait不會阻止用戶界面?

從Qt的文檔:

塊的線程,直到這兩個條件被滿足:

與此的QThread對象相關聯的線程完成執行 (即,當它從運行返回()) 。線程完成後,該函數將返回true。如果線程還沒有啓動,它也會返回true。時間毫秒已經過去。如果時間是ULONG_MAX (默認值),那麼等待永遠不會超時(線程必須從run()返回 )。如果等待時間爲 ,此函數將返回false。

+0

但是如果我不使用wait(),那麼for循環會在它執行任何操作之前重新啓動線程?我應該爲每個框架使用一個新線程嗎? –

+2

@PrimožKralj如果你想同時做多個事情,你需要多於一個線程。請注意,不受控制數量的線程是一個糟糕的主意,並且會比在單個線程中執行更慢。你可能需要像任務池,生產者 - 消費者隊列等等。 – Yakk

+0

謝謝,會讀入它。問候! –

2

From doc:

布爾的QThread ::等待(無符號長時間= ULONG_MAX)

塊的線程,直到這兩個條件被滿足:

此相關的線程QThread對象已完成執行(即從run()返回時)。

...

這提供了類似的功能的POSIX 在pthread_join() 功能。

您不應該在這裏使用wait