2013-06-22 51 views
0

我正在開發一個android應用程序,它使用opencv庫提供的類org.opencv.android.JavaCameraView打開視頻流,並從中捕獲幀,以便處理它們然後才顯示在屏幕上。如何阻止線程直到另一端

中的應用以這種方式組織:

  1. 一個主線程,其具有OnCameraFrame方法,其取得幀,並將其發送給線程A,並且該方法還負責顯示最終在屏幕上的幀。所以所有的處理都應該在獲取幀之後執行,並且在它顯示在屏幕上之前,在這個方法的「中間」。

  2. 線程A,它將獲取的幀保存到一個緩衝區中,一個BlockingLinkedQueue;

  3. 線程B,它從緩衝區中取一個幀,並將它發送給負責處理的線程,線程C;

  4. 處理該幀的線程C,並將其發送給主線程。

所以,問題是:我怎麼能阻斷方法OnCameraFrame,所以它不能在屏幕上顯示的任意幀,直到它已經從最後一個線程(C)返回?如果我沒有實現這種類型的任何東西,由於處理需要一些時間,我沒有在屏幕上正確地看到最終的幀。

我希望我已經清楚地解釋我的問題。

回答

0

該方法將是Thread.join()但您通常不應在主線程中調用它。相反,您應該不會在您的onCameraFrame()中顯示任何內容,但在計算結束時,線程C可以調用例如帶代碼的Activity.runOnUiThread()顯示框架。

0

最好避免阻塞回調 - 取決於您最終可能以ANR結束的調用線程。在回調和處理線程之間添加一個隊列。

我不知道爲什麼你需要這麼多的線程和阻塞隊列 - 使一個線程,在這個線程上創建一個處理程序,並在主線程上創建一個處理程序。當您在回調中接收到框架時​​ - 將其發佈到處理線程處理程序,處理完成後 - 將結果發佈到主線程處理程序。

相關問題