none
有關 WM6 CONTROL的問題 RRS feed

  • 問題

  • 請教各位MW6先進

    本人將原本於VB2005開發之程式碼複製到 Windows Mobiles6 時會出現下面錯誤訊息, 請教該如何解決?感謝.

    Imports System
    Imports System.Net
    Imports System.Net.Dns
    Imports System.Net.Sockets
    Imports System.Threading
    Imports System.Text
    Imports System.Windows.Forms

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Label1.Text = "Welcome"
            Control.CheckForIllegalCrossThreadCalls = False
        End Sub

    錯誤 1 'CheckForIllegalCrossThreadCalls' 不是 'System.Windows.Forms.Control' 的成員。 

     

    2010年5月13日 上午 06:25

解答

  • 參閱 MSDN文件庫

    [Control. CheckForIllegalCrossThreadCalls 屬性 ]

    版本資訊

    .NET Framework

    支援版本:3.5、3.0、2.0

    表示此屬性不支援 Compact Framework.

    另外在備註中提到
    當控制項的建立執行緒以外的執行緒嘗試存取該控制項的其中一個方法或屬性時,它通常會導致無法預期的結果。常見的無效執行緒活動為在可存取控 制項的 Handle 屬性之錯誤執行緒上呼叫。將 CheckForIllegalCrossThreadCalls 設定為 true , 可以在偵錯時更容易找到並診斷這種執行緒活動。請注意,如果在偵錯工具之外啟動應用程式,不當的跨執行緒呼叫總是會引發例外狀況。

    基本上並不建議使用此屬性來處理跨執行緒呼叫UI控制項的問題, 若要正確處理跨執行緒呼叫, 請使用委派的方式處理

    關於此類問題, 請參閱論壇過去的既有討論

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月13日 上午 06:41

所有回覆

  • 參閱 MSDN文件庫

    [Control. CheckForIllegalCrossThreadCalls 屬性 ]

    版本資訊

    .NET Framework

    支援版本:3.5、3.0、2.0

    表示此屬性不支援 Compact Framework.

    另外在備註中提到
    當控制項的建立執行緒以外的執行緒嘗試存取該控制項的其中一個方法或屬性時,它通常會導致無法預期的結果。常見的無效執行緒活動為在可存取控 制項的 Handle 屬性之錯誤執行緒上呼叫。將 CheckForIllegalCrossThreadCalls 設定為 true , 可以在偵錯時更容易找到並診斷這種執行緒活動。請注意,如果在偵錯工具之外啟動應用程式,不當的跨執行緒呼叫總是會引發例外狀況。

    基本上並不建議使用此屬性來處理跨執行緒呼叫UI控制項的問題, 若要正確處理跨執行緒呼叫, 請使用委派的方式處理

    關於此類問題, 請參閱論壇過去的既有討論

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月13日 上午 06:41
  • Bill您好

    WM6開發環境遠端連線至SERVER端登入, 可以成功接收到SERVER送回之資料, 但是Me.Label1.Text 無法顯示會出現Control.invoke的錯誤訊息,

    請教是否委派方式使用錯誤? 

     

    Imports System
    Imports System.Net
    Imports System.Net.Dns
    Imports System.Net.Sockets
    Imports System.Threading
    Imports System.Text
    Imports System.Windows.Forms

    Public Delegate Sub myDelegate(ByVal str As String)
    Public Sub updateMessageLog(ByVal str As String)
            If str.Length > 0 Then
                Me.Label1.Text = str      ----- 執行到此處出現 Control.Invoke must be used to interact with controls created on a separete thread
            End If
    End Sub

    Public Sub ReceivedData(ByVal ar As IAsyncResult)
            Try
                Dim BytesRead As Integer
                BytesRead = ClientSocket.EndReceive(ar)
                If BytesRead < 1 Then
                    Exit Sub
                Else
                    Dim messageReceived As String
                    Dim I As Integer
                    Dim StartI As Integer = 0

                    Dim data168 As String = System.Text.ASCIIEncoding.ASCII.GetString(recvBuffer, 0, BytesRead)

                    Select Case Mid$(data168, 1, 2)
                        Case "SI" 'Player In

                           'Me.Label1.Text = "User Login"
                           Dim updateDelegate As New myDelegate(AddressOf updateMessageLog)

                           updateDelegate.Invoke("User Login")

                        Case "WS"
                           GoDisConnect()
                           Thread.Sleep(150)

                           'Dim updateDelegate As New myDelegate(AddressOf updateMessageLog)

                           'updateDelegate.Invoke("Wrong Password")


                           Me.Label1.Text = "Wrong Password"

                     End Select
            

                   ClientSocket.BeginReceive(recvBuffer, 0, recvBuffer.Length, SocketFlags.None, AddressOf ReceivedData, Nothing)

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    End Sub

    2010年5月14日 上午 12:38
  • Public SubupdateMessageLog(ByVal str As String)

            If str.Length > 0 Then
                Me.Label1.Text = str     
            End If
    End Sub

    請改為

    Public SubupdateMessageLog(ByVal str As String)

      If Me.Label1.InvokeRequired Then

             Dim d As New myDelegate(AddressOf SubupdateMessageLog)

             Me.Label1.Invoke(d, New Object() {str})

      Else

            If str.Length > 0 Then
                Me.Label1.Text = str     
            End If

      End If

    End Sub

    我是直接在版上key in 的, 不知道會不會有拼錯字之類的, 自己檢查一下

     

     

     

     


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月14日 上午 08:26
  • Bill您好

    感謝您的幫忙, 已經解決問題, 謝謝!

     

     

    2010年5月17日 上午 03:05