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 :

Problème avec Thread et invoke pour maj une textbox


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Problème avec Thread et invoke pour maj une textbox
    Hello
    Mon problème est que je souhaite que mon thread routine tourne sans bloquer ma form puisse mettre à jour le texte d'une textbox à chaque traitement. Je débute avec les threads.

    Voici le code :

    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
    19
    20
    21
    22
     Dim thread_routine As Thread
     
        Private Sub BTN_envoi_Click(sender As System.Object, e As system.EventArgs) Handles BTN_envoi.Click
     
            TBX_feedback.Clear()
            thread_routine = New Thread(AddressOf Routine)
            thread_routine.IsBackground = True
            thread_routine.Start()
            Routine()
     
        End Sub
     
     
        Sub Routine()
     
            For i = 1 To 1000
                TBX_feedback.Text &= " traitement effectué "
                Thread.Sleep(1000)
            Next
     
     
        End Sub
    L'execution me retourne une exception :
    le contrôle 'TBX_feedback' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé
    Je me suis donc tourné vers l'utilisation des delegue et la méthode invoke, si je pense avoir compris le principe je bute sur sa mise en place. Un petit coup de main serait le bienvenu

    Merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    un controle ne peut etre modifié que par le thread qui l'a créé (le thread principal donc)
    depuis un autre thread, il faut alors dire au controle (dans la pratique n'importe lequel) d'appeler une méthode sur son thread via invoke
    il est possible de tester au moment de l'exécution d'une ligne de code si on est sur le thread du controle qu'on veut modifier ou non via invokerequired

    sur le framework 2 il faut explicitement déclarer et créer le délégué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private delegate sub DELEGmajtextbox(texte as string)
    public sub majtextbox(texte as string)
      if montxtb.invokerequired then
        dim d as new DELEGmajtextbox(adressof majtextbox)
        montxtb.invoke (d,texte)
        exit sub
      end if
     
      montxtb.text = texte
    end sub
    il suffit d'appeler cette méthode depuis le thread
    si invoquerequired retourne true, ca veut dire qu'on est sur un thread différent de celui du controle, donc on créé le délégué en lui disant vers quelle méthode il pointe (dans mon implémentation c'est la même méthode, mais ca peut etre une autre)
    ensuite on dit au textbox d'invoker le délégué sur son thread (on lui passe le paramètre au passage, les délégués peuvent être sans paramètre)
    ici on va réentrer dans la méthode, mais invoquired va retourner false, donc on va passer sur la mise à jour du textbox puis sortir
    puis ca revient sur exit sub et ca sort


    sur le framework 4 c'est plus simple, directement dans le code du thread on peut mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txtb.invoke(new action()(sub txtb.text = "le texte"))
    sur le framework 3.5 c'est intermédiaire, et ca doit ressembler à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txtb.invoke(new action(of string)(addressof majtextbox),"le texte")
    et dans la méthode majtextbox juste mettre la mise à jour du textbox
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Je ne connais pas VB, donc pour être sûr je copie les parties importante de cet article : http://msdn.microsoft.com/en-us/libr....80).aspx#Y100

    Code vb : 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
     
     
    Delegate Sub SetTextCallback([text] As String)
     
    Private Sub SetText(ByVal [text] As String)
     
            ' InvokeRequired required compares the thread ID of the
            ' calling thread to the thread ID of the creating thread.
            ' If these threads are different, it returns true.
            If Me.textBox1.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText)
                Me.Invoke(d, New Object() {[text]})
            Else
                Me.textBox1.Text = [text]
            End If
        End Sub

    En gros, tu crée un delegate. Puis tu regarde, avec InvokeRequired si tu dois passer par invoke ou non. Si non, c'est comme la façon normale. Si oui, tu crée un délégé (sur le SetText dans l'exemple) et tu le passe a l'invoke.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Super ça marche niquel ! Merci à tous

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/06/2010, 10h50
  2. Problème avec le passage à la ligne dans une Textbox
    Par iFlo1 dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 22/03/2009, 13h47
  3. Réponses: 6
    Dernier message: 15/06/2006, 15h15
  4. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41
  5. [Configuration] Problème avec un script de login utilisant une session
    Par HNT dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 27/09/2005, 19h56

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