我的代码被设计为2轴运动系统的控制系统。我有2个驱动器,每个驱动器输出其步数。我可以读取设备,更新属性和更新标签的文本字段。但是,它不会更新表格。当我使用消息框时,我可以显示正确的文本值,但是不会更新标签。
我很乐意尝试任何建议,但是我为此奋斗了大约16个小时,而且我精打细算-代码中显示的明显的过大/可怕的代码证明了这一点。我不明白为什么它没有更新。
此外,下面显示的所有版本的手动按钮都可以刷新表单,不会更新控件。
方向,建议?
Private Sub PositionChanged(ByVal sender As Object, ByVal e As EventArgs)
If TraverseController.InvokeRequired Then
TraverseController.Invoke(
New EventHandler(Of EventArgs)(AddressOf PositionChanged), sender, e)
Return
End If
'RaiseEvent PropertyChanged(TraverseController, New System.ComponentModel.PropertyChangedEventArgs("Position"))
MessageBox.Show(TraverseController.lblLinearDrivePosDisp.Text)
TraverseController.lblLinearDrivePosDisp.Text = CStr(_position)
Application.DoEvents()
TraverseController.lblLinearDrivePosDisp.ResetBindings()
TraverseController.GBDrivePositionDisp.Refresh()
TraverseController.lblLinearDrivePosDisp.Refresh()
TraverseController.Refresh()
TraverseController.Invalidate()
TraverseController.Update()
Application.DoEvents()
MessageBox.Show(TraverseController.lblLinearDrivePosDisp.Text)
End Sub
假设:TraverseController是表单的类名。
这看起来像是VB默认表单实例问题。显然,您正在尝试通过使用TraverseController.InvokeRequired
来将控制交互正确地编组回UI线程。但是,由于这些默认实例的创建方式,TraverseController.InvokeRequired
在辅助线程上创建了TraverseController
的新实例,所有后续代码都在修改该实例,而不是在UI线程上创建的实例。
一种解决方法是将同步控件实例传递给定义了PositionChanged
更改方法的类,并检查控件的InvokeRequired
方法而不是TraverseController.InvokeRequired
。如果包含的类本身是UI控件,则使用该类实例(Me.InvokeRequired
)。