0

J'ai un bug dans mon application qui est le même que here que cette personne a été confronté au même problème. Mon application est multithread où le thread de travail met à jour le Waveformgraph sur l'interface utilisateur. Je crois que c'est là où mon problème est et pourquoi, périodiquement, et à l'occasion je reçois un grand X rouge dans au moins un de mes objets de forme d'onde lors de l'exécution de l'application. De la lecture et de la recherche, j'ai besoin d'utiliser une méthode Invoke ou BeginInvoke? Quelqu'un peut-il expliquer mieux et fournir un exemple de code qui est pertinent pour mon code? Les échantillons que j'ai trouvés jusqu'ici me rendent toujours flou sur la façon dont j'ai besoin de faire ceci ou ce que j'ai besoin de faire. Merci de votre aide.Méthode d'appel pour une application multi-thread?

Ce code se trouve dans l'événement de clic swScopeOnOff, fil principal.

thread2 = New System.Threading.Thread(AddressOf dataAcquiring) 
    thread2.Start() 

Ce code est dans dataAcquiring Sous

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 

Répondre

2

correcte, invocation thread-safe est en fait pas aussi difficile qu'on pourrait le penser (même pas pour les événements thread-safe, mais qui est hors de propos pour cette question).

Je vous recommande d'utiliser la méthode Invoke normale, comme Me.Invoke() (où Me est la forme actuelle, sinon, utilisez Form1 ou quelque chose comme ça à la place). L'utilisation de BeginInvoke() peut être asynchrone, mais elle empile l'utilisation de la mémoire et peut causer des fuites de mémoire si EndInvoke() n'est pas appelée correctement.

Si vous ciblez .NET 4.0 ou vous pouvez simplement faire comme plus ceci:

Me.Invoke(Sub() WaveformGraph.PlotWaveformAppend(data(i))) 

Toutefois, si vous ciblez .NET 3.5 ou baissez il faut un peu plus de lignes de code.

+0

Je cible le .NET 4.0, ce qui a simplifié le processus. Merci beaucoup pour le code et "comment" et l'explication de chacun. – busarider29

+0

@ busarider29: De rien. .NET 4.0 est l'une des meilleures mises à jour à mon avis. <3 –