0

我的应用程序中有一个错误,与此人遇到相同问题的此处相同。我的应用程序是多线程的,其中工作线程正在更新 UI 上的 Waveformgraph。我相信这就是我的问题所在,以及为什么在运行应用程序时,我会在至少一个波形图对象中得到一个大的红色 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
4

1 回答 1

2

正确的、线程安全的调用实际上并不像人们想象的那么难(甚至对于线程安全事件也没有,但这与这个问题无关)。

我建议您使用普通Invoke方法,例如Me.Invoke()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))
于 2016-03-03T20:08:06.153 回答