IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.net 2005] Thread safe call


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut [VB.net 2005] Thread safe call
    Bonjour à tous,

    Dans une form, j'instancie un port série:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Friend WithEvents serialPort As IO.Ports.SerialPort
    Je l'ouvre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    serialPort = My.Computer.Ports.OpenSerialPort("COM1", 9600, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)
    Et je reçois mes données dans l'évènement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Private Sub serialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived
        Dim value As String = serialPort.ReadExisting
        txtCB.text = value
    End Sub
    Et lors de ma réception via le port série, au moment ou j'assigne ma valeur à mon textBox, j'ai l'erreur suivante:
    Croos-thread operation not valid: Control txtCB accesssed from a thread other than the thread it was created on.

    Je ne trouve pas de riason ni de solution à mon problèm.e J'imagine que l'évènement agit comme un thread mais alors comment faire pour lui permettre de modifier la valeur de la textBox sur ma form?

    J'ai fait un fonction SetValue(byval value as string) que j'appelle à partir de l'event mais l'erreur reste identique.

    Merci d'avance pour vos infos.

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut
    Personne n'a une idée sur ce problème?

    Je désespère de trouver une solution car la doc n'est pas très claire sur cette erreur.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut
    D'après la doc il faudrait que je passe par des fonction deleguate. Quelqu'un peut me donner quelques informations sur ce sujet? Je n'arrive pas à saisir ce concept ni en quoi il pourrait m'aider à résoudre mon problème.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut
    Up

  5. #5
    Membre expérimenté Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Par défaut
    En effet il faudrait passer par des delegates.
    Je m'explique :
    serialPort_DataReceived est activé dans un autre thread (sûrement le thread qui gère le port série) que celui dans lequel ton formulaire où txtCB a été conçu.
    Or les Windows Forms ne sont pas thread safe et blablabla... bref tu ne peux pas accéder à txtCB en dehors du thread où ta form a été crée.
    Comment résoudre le problème ?
    Et bien c'est assez simple, il suffit de passer par Form.Invoke (en réalité Control.Invoke).
    Pour donner un exemple, soit tu te réfère au très bon exemple MSDN soit tu es courageux et tu décrypte cet exemple en C# (je ne peux vraiment pas coder en VB, c'est au dessus de mes capacités)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //La fonction exécutée dans le thread principal qui changera la valeur
    void SetTextValue(string val, Control cont)
    {
        //On définit la valeur Text du contrôle cont
        cont.Text = val;
    }
    //Le delegate qui appellera la fonction
    delegate void SetTextValueDelegate(string val, Control cont);
    //Ton évènement que tu as marqué plus bas
    void serialPort_DataReceived(blablabla)
    {
        //On invoke notre fonction et ainsi, SetTextValue sera lancé dans le thread où la form a été créée
        Invoke(new SetTextValueDelegate(SetTextValue), "Bien Essayé", txtCB);
    }

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut
    Je te remercie beaucoup pour ton aide. Problème résolu comme suit en VB.net:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Dans le thread dataReceived du port série, j'appelle le délégué
    ...
    Invoke(New SetBarcodeDelegate(AddressOf setBarcode), value, txtCB)
    ...
     
    'La fonction exécutée dans le thread principal qui changera la valeur
    Private Sub setBarcode(ByVal val As String, ByRef cont As System.Windows.Forms.Control)
          cont.Text = val
    End Sub
     
    'Le delegate qui appellera la fonction
    Delegate Sub SetBarcodeDelegate(ByVal val As String, ByRef cont As System.Windows.Forms.Control)
    En fait c'est bien plus simple que je ne l'avais imaginé.

    Encore merci pour ta réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET 2005] thread & récupération d'information d'une form
    Par Persons dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/09/2006, 23h43
  2. DX 9 et visual.net 2005 ?
    Par ilimo dans le forum DirectX
    Réponses: 1
    Dernier message: 27/07/2004, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo