2012-12-09 53 views
2

我遇到了實現以下情形的問題。我的問題描述是這樣的:在Qt中實現線程間通信

  1. 我有3個線程。 ThreadCamera用於從相機中抓取幀。用於處理的ThreadProcess(使用OpenCV在圖像/框架上執行一些圖像處理)框架和主GUI用於顯示圖像的線程。
  2. 我不知道ThreadProcess會花費多少時間來處理圖像。所以我想將ThreadCamera中的圖像傳遞給ThreadProcess,對圖像執行一些圖像處理並將其傳遞給主GUI線程以供顯示。
  3. 當ThreadProcess處理圖像時,T​​hreadCamera應該睡眠。即它不應該從相機中抓取更多的幀。當ThreadProcess完成圖像處理任務時,它應該將圖像和一些信息傳遞給主GUI線程。在此之後,只有ThreadCamera應該醒來,並從該攝像機的runnig(ThreadCamera)線程中抓取下一幀/圖像。

感謝名單傢伙......經過一番評論把相機和圖像處理作業在一個單獨的線程我想知道另一point..which是..

  1. 如果不想要什麼而加工是怎麼回事睡覺相機?不要緊,對我來說,如果我失去了一些由CameraThread

(這在任何情況下,如果我睡覺還是不睡覺的相機,我失去)抓起幀我爲每個進程(Camera Process和Image Processing作業)和movetoThread命令使用QObject它運行在一個特定的線程中。

關於實施和信號/槽的設計將是有益的任何有識之士..

+0

如果你有兩個線程不應該同時工作......你有太多的線程。僅在這兩個線程上進行操作會消除大部分問題。 – Mat

+0

如果相機總是等待處理,爲什麼不只是使用一個線程進行相機和圖像處理?因爲您可以一氣呵成,所以可以節省您的同步問題。 – jdi

+0

@Mat ...雅是多數民衆贊成在....但圖像處理任務密集...所以我想把它放在另一個線程... –

回答

2

什麼你要找的是一個簡單的「發佈/訂閱」模式。在這種類型的「分配」模式中,所有的消息被髮送,只是客戶端下降時,它不是一個狀態接收圖像

我會實現這個作爲你的應用程序如下:

讓所有獨立線程(Camera,Processing,Gui)就像你已經做的那樣。

讓CameraThread(通過qTimer信號,如果你想簡化它)捕獲圖像並通過信號/插槽連接發送給processingThread。

當processingThread處理圖像時,它會設置一個狀態標誌(可以只是一個成員變量,一個布爾將工作)來表示它當前正在處理圖像。當你完成圖像的處理時,你會設置標誌來表示你沒有處理。

在ProcessingThreads插槽中,接收來自CameraThread的圖像,您將首先檢查您是否正在處理圖像。如果是的話,你不會對信號數據做任何事情,而只是返回。如果您未處理圖像,則將存儲信號數據並調用處理功能。

使這項工作的訣竅是在處理函數的ProcessingThreads主循環中包含function callQCoreApplication::processEvents())。這將允許ProcessingThread處理它獲取的任何信號,同時它正在做一些有用的事情。

狀態變量檢查將允許您在處理當前的圖像時「刪除」發送給您的所有新圖像,而不會將它們排隊。

+0

這樣做也可以讓您將其他線程(如果您嘗試進行某種圖像捕獲/記錄/分析)註冊到相同的攝像頭信號,而不會限制其幀率或真正丟失數據。處理圖像然後顯示需要時間,但是其他後臺線程可以處理相同的圖像數據,並可能對其有用。 – g19fanatic