我的应用程序中有一个错误,与here http://forums.ni.com/t5/Measurement-Studio-for-NET/Waveform-Graph-quot-X-quot-Error/m-p/217817/highlight/true#M1668这个人也遇到了同样的问题。我的应用程序是多线程的,其中工作线程正在更新 UI 上的波形图。我相信这就是我的问题所在,以及为什么在运行应用程序时,我会周期性地、偶尔地在至少一个波形图对象中看到一个大的红色 X。通过阅读和研究,我需要使用 Invoke 或 BeginInvoke 方法?有人可以更好地解释并提供与我的代码相关的示例代码吗?到目前为止,我发现的示例仍然让我不清楚我需要如何执行此操作或我需要做什么。感谢您的帮助。
此代码位于主线程的 swScopeOnOff 单击事件上。
thread2 = New System.Threading.Thread(AddressOf dataAcquiring)
thread2.Start()
该代码位于 dataAcquiring Sub 中
Public Sub dataAcquiring()
'While Scope switch is on, stream each Ai channel's data continuously to its respective WaveForm graph
Do While swScopeOnOff.Value = True
data = reader.ReadWaveform(readRate)
i = 0
For Each WaveformGraph In WFGS
WaveformGraph.PlotWaveformAppend(data(i)) 'This line is updating the UI's waveform graphs
i += 1
Next
i = 0
Loop
End Sub
正确的线程安全调用实际上并不像人们想象的那么难(即使对于线程安全事件也不是这样,但这与这个问题无关)。
我建议你使用普通的Invoke
方法,例如Me.Invoke()
(where Me
是当前形式,如果不是,则使用Form1
或者无论它被称为什么)。使用BeginInvoke()
可能是异步的,但它会堆积内存使用情况,如果EndInvoke()
没有被正确调用。
如果您的目标是 .NET 4.0 或更高版本,您可以简单地执行以下操作:
Me.Invoke(Sub() WaveformGraph.PlotWaveformAppend(data(i)))
但是,如果您的目标是 .NET 3.5 或更低版本,则需要多行代码。
'Outside your Sub.
Delegate Sub WaveformAppendDelegate(ByRef WaveformGraph, ByRef data)
'Create a new sub.
Public Sub AppendData(ByRef WaveformGraph, ByRef data)
WaveformGraph.PlotWaveformAppend(data)
End Sub
'Inside your sub, when you're going to invoke.
Me.Invoke(New WaveformAppendDelegate(AddressOf AppendData), WaveformGraph, data(i))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)