none
SerialPort , CF Reader 讀取 RRS feed

  • 問題

  • 想詢問有關有關serailPort的問題
    使用SerialPort的DataReceived事件接收資料(字串)
    http://msdn.microsoft.com/zh-tw/library/system.io.ports.serialport.datareceived(VS.80).aspx
    在這個link中的備註:
    SerialPort 物件收到資料時,會在次要執行緒上引發 DataReceived 事件。由於這個事件是在次要執行緒上引發,而非主執行緒,所以嘗試在主執行緒中修改某些項目 (例如 UI 項目) 可能會引發執行緒例外狀況。如果必須在主要 FormControl 中修改項目,請使用 Invoke 回傳變更要求,此方法將會針對適當的執行緒執行此作業。

    從這個敘述知道,在不同執行緒上要更改UI,會引發例外狀況

    但是想請教的是,我在mobile 5(.Net Framework 2.0)的平台上,使用時,並未產生例外狀況,顯示狀況良好
    但是,轉換成Mobile 6(.Net Framework 3.5)平台上,使用時,顯示資料相當不順利,必須使用invoke才能順利更新
    想請問,是否根據這兩個版本的差異,而有不同的寫法,但是如果依照link裡的說明,在mobile 5(.Net Framework 2.0)應該也是必須使用invoke,才能顯示順利才是

    因為讀取進來的資料會做一些分析,間接改變UI,所以不知是否因為這樣而沒產生例外狀況呢?

    2009年4月10日 上午 04:01

解答

  • 跨執行緒的做法

     Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Display(Me.SerialPort1.ReadExisting)
        End Sub
        Delegate Sub SetResultLabelDelegate(ByVal msg As String)
        Public Sub Display(ByVal msg As String)
            If ListBox1.InvokeRequired Then
                ListBox1.Invoke(New SetResultLabelDelegate(AddressOf Display), msg)
            Else
                ListBox1.Items.Add(msg)
            End If
        End Sub
    • 已提議為解答 -KYLIN- 2009年4月10日 下午 04:30
    • 已標示為解答 bauannModerator 2009年4月16日 上午 02:47
    2009年4月10日 下午 04:30
  • Hi,
    強烈建議你使用Invoke的方式去處理;這個錯誤如果你不理他,還是編譯成 exe之後去跑,還是可以執行的,也不會看到有"跨執行緒不能存取UI相關的錯誤"相關的錯誤,但是伴隨而來的就是不穩定,而且會發生非預期的錯誤,很有可能就直接秀一個"xxxx程式發生錯誤必須關閉"的錯誤,而這樣你會很難去除錯的..
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年4月10日 上午 05:33
    版主

所有回覆

  • Hi,
    強烈建議你使用Invoke的方式去處理;這個錯誤如果你不理他,還是編譯成 exe之後去跑,還是可以執行的,也不會看到有"跨執行緒不能存取UI相關的錯誤"相關的錯誤,但是伴隨而來的就是不穩定,而且會發生非預期的錯誤,很有可能就直接秀一個"xxxx程式發生錯誤必須關閉"的錯誤,而這樣你會很難去除錯的..
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年4月10日 上午 05:33
    版主
  • 跨執行緒的做法

     Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Display(Me.SerialPort1.ReadExisting)
        End Sub
        Delegate Sub SetResultLabelDelegate(ByVal msg As String)
        Public Sub Display(ByVal msg As String)
            If ListBox1.InvokeRequired Then
                ListBox1.Invoke(New SetResultLabelDelegate(AddressOf Display), msg)
            Else
                ListBox1.Items.Add(msg)
            End If
        End Sub
    • 已提議為解答 -KYLIN- 2009年4月10日 下午 04:30
    • 已標示為解答 bauannModerator 2009年4月16日 上午 02:47
    2009年4月10日 下午 04:30