从其他线程读取Checkbox状态

时间:2012-05-22 07:30:08

标签: vb.net multithreading

基本上它是this问题,但后来是VB.net。我需要从主线程以外的另一个线程检查CheckBox状态。链接问题的解决方案包含C#代码。在线翻译不会产生可理解的结果。

我的代码(剥离到基本部分):

Public Class UI
    'UI contains CheckBox1.
End Class

Public Class Worker
    Public Sub Input()
        Dim thrMyThread As New System.Threading.Thread(AddressOf Run)
        thrMyThread.Start()
    End Sub

    Public Sub Run()
        If UI.CheckBox1.Checked = True
            MsgBox("True")
            ShellandWait("application.exe")
        Else
            MsgBox("False")
            ShellandWait("application.exe")
        End If
    End Sub

End Class

ShellandWait是一个自定义函数,它启动一个进程并等待它退出。 由于ShellandWait我需要另一个线程来保持我的UI响应。

更新
我确实通过在Worker Class的开头定义一个Public布尔变量来找到解决方法,它表示UI.CheckBox的状态。所以:

Public Class Worker
    Public cB As Boolean = UI.CheckBox.Checked
    ... 'Rest of Code
    Public Sub Run()
        If cB = True
            MsgBox("True")
            ShellandWait("application.exe")
        Else
            MsgBox("False")
            ShellandWait("application.exe")
        End If
    End Sub
End Class

1 个答案:

答案 0 :(得分:1)

这应该有效。此代码将使您能够从工作线程访问GUI。

Public Delegate Function GetCheckBoxChekedDelegate(cb As CheckBox) As Boolean

Public Function GetCheckBoxChekedFunction(cb As CheckBox) As Boolean
    Return cb.Checked
End Function

Public Function GetChecked(cb As CheckBox) As Boolean
    If cb.InvokeRequired Then

        Dim del As GetCheckBoxChekedDelegate
        del = AddressOf GetCheckBoxChekedFunction


        Dim parArray() As Object = {cb}

        Return CBool(cb.Invoke(del, parArray))
        'Return CBool(cb.Invoke(del, New Object() {cb}))
        'Return CBool(cb.Invoke(del, {cb}))

    Else
        Return cb.Checked

    End If
End Function

您可以使用 GetChecked 函数来获取复选框的选中状态,该函数将在主线程和工作线程上运行。

当从工作线程调用 GetChecked 函数时, InvokeRequired 将返回true,因此在 cb.Checked 中读取 cb.Checked 函数 GetCheckBoxChekedFunction cb.Invoke(del,{cb})命令在主线程上调用