0

私のアプリケーションには、この人が同じ問題に遭遇していたのと同じバグがあります。私のアプリケーションはマルチスレッドで、ワーカー スレッドが UI の Waveformgraph を更新しています。それが私の問題の原因であり、アプリケーションを実行しているときに、少なくとも 1 つの波形グラフ オブジェクトに大きな赤い 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()MeForm1BeginInvoke()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 に答える