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 :

Opération inter-Thread + inter-Class [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Par défaut Opération inter-Thread + inter-Class
    Bonjour,
    Désolé de vous déranger, j'ai un petit problème avec les threads et les classes.
    Je 'sais' réaliser une opération cross-threads avec les Delegate ainsi que je sais réaliser une opération cross-class avec "Form1.[...]", cependant je n'arrive pas à modifier le texte d'une TextBox qui soit sur une classe distante, lancé par un thread, exemple:


    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
    23
    24
    25
    26
    27
    Imports System.Threading  
     
    Public Class Form1  
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  
            Dim newTest As New Test  
            Dim newThread As Threading.Thread = New Thread(AddressOf newTest.start)  
            newThread.Start()  
        End Sub  
    End Class  
     
    Public Class Test  
        Delegate Sub SetTextCallback(ByVal text As String)  
        Private Sub Message(ByVal text As String)  
            If Form1.TextBox1.InvokeRequired Then  
                Dim d As New SetTextCallback(AddressOf Message)  
                Form1.Invoke(d, New Object() {text})  
                MsgBox("A")  
            Else  
                MsgBox("B")  
                Form1.TextBox1.Text &= vbCrLf & text  
            End If  
        End Sub  
     
        Public Sub start()  
            Message("Add This")  
        End Sub  
    End Class

    Comme vous pouvez le voir, j'ai lancé mon thread afin d'exécuter le Sub distant, start().
    Cependant, la TextBox ne se remplit pas et seul la MessageBox "B" s'affiche, ce qui n'est pas le cas quand l'opération n'est pas inter-classe.

    Ai-je commis un erreur? ou alors, ai-je simplement utilisé la mauvaise fonction?

    Merci d'avance pour votre aide, encore désolé du dérangement.
    A+.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 196
    Par défaut
    Citation Envoyé par Orci76 Voir le message
    je sais réaliser une opération cross-class avec "Form1.[...]"
    non
    les débutants faisant du vb.net, microsoft a laissé écrire ca, mais ca marche une fois sur deux car ca n'a pas de sens

    il est possible d'avoir plusieurs instances de Form1 affichée à un instant T
    or en écrivant Form1.Textbox1.Text = "valeur", ca devient caduque !
    VB créé donc à la compilation une variable accessible de partout ayant le nom de la classe de type Form, mais cette variable contient au mieux la dernière instance créée
    mais cette fausse variable n'est faite que pour les Form, or du cross class comme tu dis, on peut en faire avec toutes les classes avec la méthode qui suit

    pour modifier une autre classe, il faut une référence vers celle ci
    = que ta classe test ait une variable privée As Form1, et que quelqu'un lui donne la référence pour la ranger


    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public class form1
     
      private sub bouton_click ...
          dim t as new test(me) ' on passe une référence de form1, en l'occurrence me
          t.startThread
      end sub
     
    end class
     
    Public Class Test
      private _f as form1
     
      public sub new(f as form1) ' on demande une variable à la création
         _f = f ' stockage dans une variable de classe pour pouvoir la retrouver dans les autres méthodes de la classe
      end sub
     
      public sub startThread
         ' j'ai déplacé le démarrage du thread ici, mais ca n'apporte rien de spécial
         dim th as new system.threading.thread(addressof start)
         th.start
      end sub
     
      private sub start
         Message("Add This") 
      end sub
     
      Delegate Sub SetTextCallback(ByVal text As String) 
      Private Sub Message(ByVal text As String)  
            If _f.TextBox1.InvokeRequired Then  
                Dim d As New SetTextCallback(AddressOf Message)  
                _f.Invoke(d, New Object() {text})  
                MsgBox("A")  
            Else  
                MsgBox("B")  
                _f.TextBox1.Text &= vbCrLf & text  
            End If  
      End Sub  
     
    end sub
    là on passe une référence
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse si rapide, Pol63.
    Mon problème ainsi qu'un autre que j'avais, venant aussi certainement de cette histoire d'instance de Form est dès maintenant résolu, grâce à toi.
    Je te remercie donc, non seulement pour cette réponse, mais aussi surtout de m'avoir appris quelque chose de si important!

    Merci encore, bonne fin de matinée.

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

Discussions similaires

  1. éviter opération inter thread
    Par Pol63 dans le forum VB.NET
    Réponses: 10
    Dernier message: 25/08/2014, 22h32
  2. Opérations inter-threads entre deux classes
    Par Nicorombe dans le forum VB.NET
    Réponses: 3
    Dernier message: 07/05/2011, 16h36
  3. Réponses: 6
    Dernier message: 01/12/2009, 10h52
  4. Opération inter-threads non valide
    Par nakk01 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/05/2009, 01h43
  5. Erreur : Opération inter-threads non valide
    Par cadeau dans le forum C++/CLI
    Réponses: 1
    Dernier message: 12/12/2006, 09h07

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