0

基本上是这个问题,但是对于 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 响应。

更新
我确实找到了解决方法,Public方法是在 Worker Class 的开头定义一个布尔变量,它代表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
4

1 回答 1

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,因此在函数GetCheckBoxChekedFunction中读取cb.Checked值,该函数由cb.Invoke(del, {cb})命令在主线程上调用。

于 2012-05-22T08:13:05.013 回答