none
請教抓GPS的資料要呈現在textbox 所產生的錯誤 RRS feed

  • 問題

  • Private Sub Ser_GPS_DataReceived(ByVal sender As Object, ByVal e As system.IO.Ports.SerialDataReceivedEventArgs) Handles Ser_GPS.DataReceived


            Dim GPS_stream As String = Ser_GPS.ReadExisting

            txt_gps_stream.Text = GPS_stream
            Label13.Text = "a"


        End Sub

    '----------------------------------------------------------------------------------------------------

    錯誤應該是發生在上面的副程式

     

    在pda執行時會出現如下的錯誤

    「Control.Invoke必須用來與不同執行緒所建立的控制項進行互動。」

     

    但是同樣的方法使用在 [WINDOWS應用程式] 的專案中卻可以執行,

    請問各位學長,我需要修改哪些地方

     

     

     

    2008年5月4日 下午 12:41

解答

  •     Private Sub ser_gps_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Ser_GPS.DataReceived

            txt_gps_stream.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})

        End Sub


        Public Delegate Sub myDelegate()


        Public Sub updateTextBox()
            With txt_gps_stream
              
                .Text = (Ser_GPS.ReadExisting)

            End With
        End Sub

    '--------------------------------------------------------------------------------------------------------------------------

    以上方法搞定,謝謝各位學長指導

    2008年5月5日 上午 03:30
  • Hi,

    關於"參考非共用成員需要物件參考"這個錯誤訊息,通常是要在Sub/Function加上Shared關鍵字,讓他變成靜態的成員;不過把DataReceived事件放到模組中,這感覺怪怪的;我想以GPS的特性來說,你可以做一個類別(Class),這個類別裡面建立一個執行緒去抓GPS的資料,並且把GPS的資料暫存起來;之後提供屬性或是方法來讓其他的Form抓最新的座標資料。

     

    題外話,線上教學課程也有Mobile系列的,其中一篇也有提到GPS,可以去看看,參考一下。

    http://www.microsoft.com/taiwan/msdn/elearning/Teaching/WMDev/video6/

    2008年5月7日 上午 03:15
    版主

所有回覆

  • 在這個地方如果要改變UI(也就是Label3.Text)會遇到問題,在SerialPort.DataReceived 事件這邊有如下說明

     

    SerialPort 物件收到資料時,會在次要執行緒上引發 DataReceived 事件。由於這個事件是在次要執行緒上引發,而非主執行緒,所以嘗試在主執行緒中修改某些項目 (例如 UI 項目) 可能會引發執行緒例外狀況。如果必須在主要 FormControl 中修改項目,請使用 Invoke 回傳變更要求,此方法將會針對適當的執行緒執行此作業。

     

    要改用委派來做,可以參考這篇

    http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=1888522&SiteID=14

    但從你的錯誤訊息來看不是針對這個部分的,建議先把這部分修改完成之後,檢查一下程式碼中有用到Invoke/BeginInvoke的部分。

    2008年5月4日 下午 01:23
    版主
  •     Private Sub ser_gps_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Ser_GPS.DataReceived

            txt_gps_stream.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})

        End Sub


        Public Delegate Sub myDelegate()


        Public Sub updateTextBox()
            With txt_gps_stream
              
                .Text = (Ser_GPS.ReadExisting)

            End With
        End Sub

    '--------------------------------------------------------------------------------------------------------------------------

    以上方法搞定,謝謝各位學長指導

    2008年5月5日 上午 03:30
  •  guppykuo 寫信:

        Private Sub ser_gps_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Ser_GPS.DataReceived

            txt_gps_stream.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})

        End Sub


        Public Delegate Sub myDelegate()


        Public Sub updateTextBox()
            With frm.txt_gps_stream
              
                .Text = (Ser_GPS.ReadExisting)

            End With
        End Sub

     

     

    我把以上的程式碼搬到模組,

    但在表單  frm中的txt_gps_stream並未顯示GPS的文字串流

     

    從偵錯模式來看,ser_gps.readexisting這段程式有讀到GPS進來的資料,

    但是 .text=(ser_gps.readexisting) 這一行卻有 [參考非共用成員需要物件參考] 的訊息 (在實機操作中並未跳出錯誤訊息,要在偵錯模式下才知道這裡有問題)

    請問這段要如何修改?

     

    2008年5月6日 下午 04:38
  • Hi,

    關於"參考非共用成員需要物件參考"這個錯誤訊息,通常是要在Sub/Function加上Shared關鍵字,讓他變成靜態的成員;不過把DataReceived事件放到模組中,這感覺怪怪的;我想以GPS的特性來說,你可以做一個類別(Class),這個類別裡面建立一個執行緒去抓GPS的資料,並且把GPS的資料暫存起來;之後提供屬性或是方法來讓其他的Form抓最新的座標資料。

     

    題外話,線上教學課程也有Mobile系列的,其中一篇也有提到GPS,可以去看看,參考一下。

    http://www.microsoft.com/taiwan/msdn/elearning/Teaching/WMDev/video6/

    2008年5月7日 上午 03:15
    版主
  • 謝謝指導

    因為我不是學資訊的,很多觀念都沒有。

    往後仍請多多幫忙

    2008年5月7日 上午 03:59