基本上它是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
答案 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})命令在主线程上调用。