none
跨线程访问控件问题 RRS feed

  • 问题

  •  

    我从主线程中创建了一个子线程,并想在子线程中改变主线程的一个Label的属性

    我在子线程中使用委托

    Private Delegate Sub LabelTextInvoke(ByVal sLabel As Label, ByVal newText As String)

    Public Sub LabelTextChange(ByVal sLabel As Label, ByVal newText As String)
            sLabel.Text = newText
    End Sub

     

    线程过程中使用

    Label1.Invoke(New LabelTextInvoke(AddressOf LabelTextChange), New Object() {Label1, "XXXX"})

     

    结果得到的是“当前线程不在单线程单元中,无法创建ActiveX……”

     

    这个该怎么办啊?

    以前使用还没出现这个错误,忽然间就……郁闷啊!

     

    2008年9月12日 13:31

答案

  • 你好,参考以下内容:

        Dim workthread As Threading.Thread
        Private Delegate Sub LabelTextInvoke(ByVal sLabel As Label, ByVal newText As String)
        Public Sub LabelTextChange(ByVal sLabel As Label, ByVal newText As String)
            If sLabel.InvokeRequired Then
                Dim li As New LabelTextInvoke(AddressOf LabelTextChange)
                Dim par As Object() = {sLabel, newText}
                sLabel.Invoke(li, par)
            Else
                sLabel.Text = newText
            End If
        End Sub
        Sub work()
            Me.LabelTextChange(Me.Label1, "xxxxx")
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.workthread = New Threading.Thread(AddressOf work)
            Me.workthread.Start()
        End Sub

    2008年9月13日 2:26