Erreur sur réception de données Port COM

Zayann Messages postés 75 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 15 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.

Quelqu'un peut-il m'éclairer s'il vous plait.

Environnement : VS2008
OS : windows XP Pro

3 réponses

cs_lim Messages postés 329 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 10 mai 2014 7
14 févr. 2013 à 15:59
Salut,

sujet évoqué ici
http://www.vbfrance.com/forum/sujet-CROSS-THREAD-OPERATION-NOT-VALID_1560214.aspx

Tu dois utilisé un délégué pour une opération interthread.

@+LIM
0
Utilisateur anonyme
14 févr. 2013 à 23:26
Bonjour,

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
0
Utilisateur anonyme
15 févr. 2013 à 00:43
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
0
Rejoignez-nous