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

VB.NET Discussion :

Invoke et delegate


Sujet :

VB.NET

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Invoke et delegate
    Bonjour à tous,

    Malgré des recherches et de nombreux posts lus, j'en arrive à demander votre aide.
    Je ne parviens pas à comprendre comment fonctionne la fonction invoke.

    J'ai créé une classe "Balance" qui me permet de lire la valeur retournée par une balance sur le port serie.
    Dans un formulaire, je veux afficher le résultat dans une TextBox.

    Comme la communication est dans un thread, je dois utiliser un delegate et un invoke, mais définitivement je n'arrive pas à comprendre où je dois mettre quoi...

    Est ce que quelqu'un qui maîtrise le sujet peut tenter d'éclairer mon esprit embrouillé ?

    D'avance merci !

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonjour,
    Puisque personne ne s'est manifesté, je ne vais pas te laisser comme ça sans aucun avis...
    Il parait que pour la méthode de réception ceci est efficace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Public Class Form1
         Delegate Sub SetTextCallback(ByVal Recu As String)
     
        Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mySerialPort.DataReceived
            System.Threading.Thread.Sleep(100) 'une pause de 100ms
            SetText(mySerialPort.ReadExisting())
        End Sub
     
        Private Sub SetText(ByVal Recu As String)
            If Me.textbox1.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText)
                Me.Invoke(d, New Object() {Recu})
            Else
                me.textbox1.text = Recu
            End If
        End Sub
    end class
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse.

    Je vais étudier ton code, j'avais trouvé sensiblement la même chose mais j'ai peut-être loupé quelque chose.
    J'ai contourné le problème avec un attribut sur ma classe qui vient se renseigner quand le thread est terminé, mais c'est pas très clean...

    Bonne journée !

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Février 2013
    Messages : 36
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Si cela peut t'aider :

    Les contrôles dans les Windows Forms sont liés à un thread spécifique et ne sont pas thread-safe. Par conséquent, si vous appelez une méthode d'un contrôle à partir d'un autre thread, vous devez utiliser l'une des méthodes Invoke du contrôle pour marshaler l'appel au thread approprié. Cette propriété peut être utilisée pour déterminer si vous devez appeler une méthode Invoke, ce qui peut être utile si vous ne savez pas quel thread possède un contrôle.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    Delegate Sub SetTextCallback(ByVal Recu As String)
    est l'objet de type délégué permettant de pointer vers n'importe quelle Sub ayant la même signature.

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub SetText(ByVal Recu As String)
            If Me.textbox1.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText)
                Me.Invoke(d, New Object() {Recu})
            Else
                me.textbox1.text = Recu
            End If
    End Sub

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.textbox1.InvokeRequired
    On teste si le thread de l'appelant se trouve sur un thread différent de celui sur lequel le contrôle a été créé.
    lorsque "invoke" requis cela signifie que l'on va devoir communiquer avec un autre thread.

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim d As New SetTextCallback(AddressOf SetText)
                Me.Invoke(d, New Object() {Recu})
    instanciation et assignation(ou "pointage" ou encore "aiguillage") du délégué pour la méthode SetText

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Invoke(d, New Object() {Recu}
    Exécute le délégué spécifié sur le thread qui détient le handle de fenêtre sous-jacent du contrôle, avec la liste d'arguments spécifiée.


    j'espère que cela ta parait un peu moins obscure.

Discussions similaires

  1. Invoke Delegate - plus souple
    Par megamario dans le forum VB.NET
    Réponses: 8
    Dernier message: 20/02/2013, 21h04
  2. Conversion Invoke Delegate C# en VB.net
    Par megamario dans le forum Visual Studio
    Réponses: 0
    Dernier message: 08/04/2010, 10h47
  3. [C#][Thread][Invoke] petit problème de delegate
    Par clinic dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 22/06/2007, 11h38
  4. [P/Invoke/Delegates] Finesse d'un wrapper P/Invoke
    Par DeusXL dans le forum C++/CLI
    Réponses: 3
    Dernier message: 12/09/2006, 12h48
  5. [Com] Interface IDispatch.Invoke
    Par Laurent Dardenne dans le forum Windows
    Réponses: 4
    Dernier message: 15/06/2004, 22h51

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