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, problème d'utilisation


Sujet :

VB.NET

  1. #1
    Invité
    Invité(e)
    Par défaut Invoke, problème d'utilisation
    Bonsoir,

    Je vien vous demander de l'aide apres 3heures de recherche sur l'utilisation de l'invoke pour un label et une progressbar. Je n'y comprend absolument rien ! Vous etes mon dernier recourt, je vous demande de bien vouloir prendre le temps de rediger votre message pour que je comprenne comment marche l'invoke.

    J'espere avoir une reponse tres rapidement
    @+ tout le monde

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Toujours est-il que tu n'as pas encore exposé ton problème à savoir donner le message d'erreur rencontré, qu'est-ce qui te bloque pour pouvoir avancer, mettre un bout de code.

    Si c'est uniquement l'utilisation de la méthode Invoke alors je pense que le site MSDN t'aidera beaucoup mieux ici.

  3. #3
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Label label = ...;
    Dispatcher.Invoke(DispatcherPriority.Normal, () => label.Text = "hello world");
    Version alternative (le compilateur transforme en fait la première version en celle-ci) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private class TextLabelInvoker
    {
       public Label Label;
     
       public void Do()
       {
          Label.Text = "Hello world";
       }
    }
     
    var invoker = new TextLabelInvoker { Label = ... };
    Dispatcher.Invoke(DispatcherPriority.Normal, invoker.Do);
    Ceci ajoutera la méthode passée en argument (qui change le texte du label) à la file d'attente du thread UI et attendra qu'elle ait été exécutée.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    @DonQuiche, là tu supposes que c'est du WPF (ou Silverlight), mais je soupçonne que la question porte plutôt sur Windows Forms...

    Et puis on est dans le forum VB.NET, pas C#... pas très réveillé en ce lundi matin ?

  5. #5
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Erf. Non, en effet, le début de semaine est rude.

    Bon, en VB, ça doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim label As ...
    Dispatcher.Invoke(DispatcherPriority.Normal, Sub() label.Text = "hello world")
    Et la version alternative reste similaire : une classe avec un champ Label, une méthode "Do" à invoquer et on passe "AddressOf invoker.Do" en argument.

    Enfin, que ce soit WPF ou Winforms, le principe reste le même.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Je supposes que tu cherche à pouvoir toucher à l'interface alors que ton traitement est un cours, donc tu dois mettre à jour ta progress bar et ton label dans une méthode déléguée.

    Je pense qu'il faut faire de la manière suivante

    Tu créées une méthode qui met à jour ton label (et ta progress bar) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private sub methode
    me.label1.text = "OK"
    End sub
    Tu déclares une methode déléguée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public delegate sub delegate_methode()
    Et dans ton traitement tu appelles ta méthode déléguée par invoke de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke(New delegate_methode(AddressOf methode))
    EDIT : Pris de vitesse, je ne sais pas quelle méthode est le plus adapté
    Le Porc est un loup pour le Porc.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    pour l'explication :
    un controle ne peut etre modifié que depuis le thread qui l'a créé
    les controles sont créés sur le thread principal, sur un thread secondaire ca plantera en cas de modification

    la solution est donc de dire au threadd principal de faire la modification
    pour ca il faut faire une méthode qui effectue la modification du controle, et spécifier au thread principal qu'il doit appeler cette méthode

    pour savoir si au moment de l'exécution on est sur un autre thread que celui du controle, il y a invokerequired qui retourne true si l'on est sur un autre thread, donc si la modification requière l'utilisation d'un invoke
    ensuite il faut un délégué (= pointeur vers une méthode)

    dans le temps les méthodes d'appels d'un délégué ont évolué, voici 2 exemples pour windows forms

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private delegate sub DeleglabelSetText(t as string)
     
    private sub labelSetText (t as string)
      if label.invokerequired then
        ' on est sur un autre thread
        dim d as new new DeleglabelSetText(AddressOf labelSetText )
        label.invoke(d,t)
        exit sub
      end if
      label.text = t
    end sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private sub labelSetText (t as string)
      if label.invokerequired then
        label.invoke(new action(of string)(AddressOf labelSetText ), t)
        exit sub
      end if
      label.text = t
    end sub
    ce 2ème exemple est plus court grace à la classe action
    le principe c'est que si la méthode est appelée sur un autre thread, on rentre dans le if, qui demande l'appel de la même méthode, mais sur le bon thread
    le 2ème appel ne passe donc pas dans le if et modifie le label
    à la fin du 2ème appel, on revient dans le 1er appel et on passe à la ligne exit sub qui fait qu'on sort

    la version encore plus pratique est celle donnée par DonQuiche, qui permet de faire ceci au sein de la méthode du thread, et en plus permettant de faire n'importe quoi sans faire une méthode spécifique, grace à une méthode anonyme
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Invité
    Invité(e)
    Par défaut
    Waw c'est si simple que sa....
    J'etudie ces codes ce soir je vous tient au courant.

    Pour ma progressbar j'ailerais utiliser la fonction value,maximum vous pouver me montrer a l'aide d'un invoke ?

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    envoie nous ton projet, on va tout coder à ta place

    (c'est ironique)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    envoie nous ton projet, on va tout coder à ta place
    J'hésitais de mettre ça comme réponse. Merci

  11. #11
    Invité
    Invité(e)
    Par défaut
    Merci en etudiant vos codes j'ai compris
    Resolu !

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

Discussions similaires

  1. Fonction "Invoke()" problème/utilisation
    Par Ullrik dans le forum C#
    Réponses: 5
    Dernier message: 12/05/2010, 21h01
  2. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  3. [cvs] problèmes d'utilisation
    Par gromite dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 17h41
  4. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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