2010-11-05 31 views
1

我有一個數據進來的串行端口。我實現串口連接與RXTX庫與串口事件監聽器。因此,只要串口中有可用的輸入數據,同步函數serialEvent(SerialPortEvent oEvent)就會運行。基本上,隨着數據不斷進入,程序將處於無限循環。我將傳入的數據組織成一個整數數組。現在我想讓這個數組與我的其他類共享,這將使這個數組執行不同的任務。我可以說,隨着循環中運行的串行事件偵聽器和數組不斷變化,我希望所有其他類共享這個更改的數組數據。我以前學過一些關於java.util.observables的知識。當我在線搜索時,我看到其他人使用sychronized()和notify()/ notifyAll()在線程之間共享變量。Java:觀察者或同步+通知()在串口傳入數據

我不確定哪一個最好用?如果他們都在這種情況下工作,那麼我需要注意的最重要的部分是什麼?有沒有其他方法仍然能夠實現我想要的?

回答

0

你的問題是非常不清楚,但我可以給你一個一般性的建議。

使用串行端口對象的簡單方法是打開輸入或輸出流並只讀取/寫入字節。事件填充用於不希望線程阻塞等待讀取數據的情況。

我建議你仔細閱讀這些RXTX examples,特別是前兩個說明基於流和事件的方法。

如果這沒有幫助,請用一些Java代碼或僞代碼來更新問題,以解釋您正在嘗試執行的操作。

跟進

從您的 「答案」 來看,你似乎誤解了什麼​​一樣。簡單地說,它只是停止兩個線程同時執行某些代碼區域。

您的問題還涉及到一個線程以某種方式告訴另一個線程新數據已到達並需要處理。而且,您還遇到了數據必須在第一個線程用下一個數據塊覆蓋之前處理的問題。

我建議您首先閱讀Concurrency上的Java教程流。這可能不會直接解決您的問題,但它應該讓您開始以正確的方式思考問題。

+0

感謝您的糾正。起初,我只是想着不同的線程可以訪問相同的數據。首先想到的是將這些數據作爲其他線程的參考。我沒有想到併發性。感謝提醒我。 – DYL 2010-11-08 04:38:24

0

如果沒有關於您的應用程序的額外信息,很難分辨出來。當你說「其他班級」時,你的意思是「其他線程」?

如果您的其他類是線程,並且您希望它們等待新數據,那麼只要有新數據可用,就可以讓它們具有wait(),並讓您的串口事件偵聽器notifyAll()。這將喚醒正在等待的線程。但請注意,這隻能解決通知:您仍然需要處理對數據數組的併發訪問,因爲有可能新數據到達,而其他線程正在訪問它。

在另一方面,如果你使用Observable,那麼當你調用Observable.notifyObservers(),這將導致每個Observerupdate()方法被調用,所有在當前線程(即調用Observable.notifyObservers()線程)的情況下。如果您希望其他線程訪問數據,您仍然需要某種方式來通知它們(例如,您的update()方法最終可能最終實際調用notify())。

如果您提供了有關您正在嘗試執行的操作的更多信息,我們可能會爲您提供進一步幫助。

0

對不起,我的問題不清楚。我應該給出一些我正在使用的代碼。請參考下面的鏈接:

http://www.arduino.cc/playground/Interfacing/Java

基本上此示例代碼是通過聲明對一些功能的「同步」的關鍵字與從串行端口上的基於事件的通信那些經典RXTX例子不同。其中我的工作的唯一部分是串行事件偵聽器內:

public synchronized void serialEvent(SerialPortEvent oEvent) { 

    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { 
     try { 
      //////////////////////////////////// 
      1) I will parse the incoming data into an integer array 
      2) this array will be shared with other classes, let me 
        explain some of them below..... 
      //////////////////////////////////// 
     } catch (Exception e) { 
      System.err.println(e.toString()); 
     } 
    } 
} 

功能A:一個applet做使用該共享陣列中的數據的2D/3D圖形。

功能B:GUI將輸出/打印從共享數組計算的一些數字到jframe中的textarea。它也可以用一個按鈕打開Function A applet。但也有在GUI中的某些按鈕會改變在功能上的一些變量導致不同的行爲來處理功能A.共享陣列

這就是我想要的:

由於串行數據進來和解析到數據數組中......

1)功能B將立即打印與此數據陣列相關聯的數字。只有當用戶點擊該按鈕才能顯示Function A小程序時,功能A將顯示2D/3D圖形。

2)當功能A和B都處於激活狀態時,它們自己的變量會隨着輸入的串行數據一起發生變化。

我希望函數A和B在serialEvent()中更改時立即捕獲共享數據數組中的更改。我知道最簡單的方法是傳遞數據數組作爲參考,並在下一個傳入數據可用之前調用每個函數。但前面提到的問題是Grodriguez。當功能A或B正在進行時,可能會有一些丟失的傳入數據。我在幾年前在java中做了一些有關MVC的內容,它使用不同類或GUI之間的可變長度來顯示溫度。就像我在文本框中輸入溫度時一樣,帶滑塊的另一個GUI將變爲輸入溫度。當我在這裏改變滑塊時,它會改變另一個GUI中的溫度。串行事件讓我想起這裏的這個應用程序。我不確定這是在這裏應用的最佳方法,還是可能有其他更好更簡單的方法來實現我想要的。

再次感謝您的耐心等待。

+1

請勿將隨訪作爲答案。如果您希望人們注意到它們,請使用評論。 – 2010-11-07 05:22:11

+0

您能否編輯您的問題以包含附加信息,然後刪除此答案? – Grodriguez 2010-11-08 10:00:05