2011-06-28 106 views
0


我正在開發一種簡單的防盜java應用程序作爲大學項目。它通過攝像機記錄場景,並通過製作像素差異來檢測場景中發生的許多變化(您可以在這裏看到完整的源代碼:https://github.com/lmammino/movementDetector)。 我使用opencv java綁定來處理我需要在圖像上執行的各種操作。
我有一些問題,我希望用戶通過使用主用戶界面中的某些按鈕來啓動/停止/重新啓動視頻捕獲過程。
要捕獲視頻流,我使用java opencv提供的類CanvasFrameOpenCVFrameGrabber。我有一個deveoped一個Runnable類叫做Detector(完整的源代碼在這裏:http://bit.ly/l1Z3tYjava opencv應用程序線程問題

Detector類通過調用其start方法自動運行自己的新主題:

public void start() 
{ 
    if (this.thread == null) 
     this.thread = new Thread(this); 

    this.isThreadActive = true; 
    this.thread.start(); 
} 

我第一次調用start方法從Detector實例一切工作正常。 當我嘗試停止並重新啓動過程時,它會給出無效的線程狀態異常...

因此,我認爲整個問題在這裏:「什麼是啓動/停止/重新啓動線程的最佳方式?

TNX

回答

2

是你停止/重新啓動實際上是一個Runnable,或者是一個Thread對象?如果我沒有記錯,只能運行一次線程。如果你想多次運行它,你需要多次運行Runnable,而不是線程。

來自Thread文檔:It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.

+0

如何多次運行runnable?它會像單獨的線程一樣工作嗎? (TNX無論如何) –

+1

@Luciano:你可以採取相同的Runnable並將其傳遞到一個新的線程,如:Thread mynewThread = new Thread(oldrunnable); mynewThread.start(); –

+0

我有'無效的內存訪問的位置0x0 rip = 0x7fff873bdf10'當我嘗試殺死線程...它似乎與'libopencv_highgui.2.2.dylib'插件(mac綁定到opencv gui)相關的東西 –