Zayann
Messages postés75Date d'inscriptionmardi 22 avril 2008StatutMembreDernière intervention15 juillet 2015
-
14 févr. 2013 à 15:37
Utilisateur anonyme -
15 févr. 2013 à 00:43
Bonjour à tous.
J'utilise un port RS232 pour recevoir des données d'un banc de test (quelques octets toute les 500ms)
Or à la réception j'ai une erreur.
Partie du Code :
Public Sub DatareceivedTreatment(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CurrentPort.DataReceived
Dim DataFromBench as String = ""
DataFromBench = CurrentPort.ReadExisting()
TB_AllData.Text += DataFromBench
End Sub
Lors de l'affectation des données à la TextBox "TB_AllData", j'ai une erreur : "Cross-thread operation not valid: Control 'TB_AllData' accessed from a thread other than the thread it was created on."
Je ne comprend pas l'erreur.
J'ai juste besoin de récupérer mes données, qui arrivent de manière asynchrone pour les traiter ensuite et afficher les résultats. C'est assez basique comme traitement.
Dans ton cas, et uniquement dans ton cas, le plus simple est de passer ton port en argument au délégué mentionné par lim :
Option Strict On
Public Class Form1
'délégué avec un serial port en paramètre
Private Delegate Sub MonDelegue(ByVal UnPort As IO.Ports.SerialPort)
Public Sub DatareceivedTreatment(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CurrentPort.DataReceived
'si nécéssité du délégué
If Me.InvokeRequired Then
'invocation du délégué avec l'adresse de la sub à exécuter et le port en paramètre (sender)
Me.Invoke(New MonDelegue(AddressOf MaSubTraitement), sender)
Else
'sinon on traite directement sans délégué
MaSubTraitement(DirectCast(sender, IO.Ports.SerialPort))
End If
End Sub
'sub de traitement des données
Private Sub MaSubTraitement(ByVal MonPort As IO.Ports.SerialPort)
TB_AllData.Text &= MonPort.ReadExisting
End Sub
End Class
Un admin (si il tombait sur ce post) pourrait-il supprimer mon message précédent ?
Merci d'avance
Je me rends compte à l'instant qu'on peut faire plus simple en 'castant' l'objet sender :
Option Strict On
Public Class Form1
'délégué avec un serial port en paramètre
Private Delegate Sub MonDelegue(ByVal sender As Object, ByVal e As IO.Ports.SerialDataReceivedEventArgs)
Public Sub DatareceivedTreatment(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CurrentPort.DataReceived
'si nécéssité du délégué
If Me.InvokeRequired Then
'invocation du délégué avec l'adresse de la sub à exécuter et le port en paramètre (sender)
'et l'argument e
Me.Invoke(New MonDelegue(AddressOf DatareceivedTreatment), sender, e)
Else
'sinon on traite directement sans délégué en récupérant l'objet sender
TB_AllData.Text &= DirectCast(sender, IO.Ports.SerialPort).ReadExisting
End If
End Sub
End Class