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 :

Explication Multi Thread [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut Explication Multi Thread
    Bonjour ! Je suis tout nouveau sur ce forum car je viens de me mettre au VB.net mais malheureusement j'ai déjà un problème...
    J'ai crée une connexion socket, avec une fenêtre ou se trouve un label qui se modifie en fonction de la connexion( "En ligne" si connecté // "Non connecté" si non connecté )

    Opération inter-threads non valide : le contrôle 'Label1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    Après des recherches sur ce problème je comprend qu'il faut que je gère le multi thread, certain parle de Backgroundworker et d'autre de
    InvokeRequired - Invoke

    Je voudrais savoir quel est le meilleur moyen de gérer ça ?
    J'ai cru comprendre que Backgrounworker était plus pour les thread lourd...
    Je comptais donc me tourné vers InvokeRequired et invoke mais je ne sais pas comment l'utiliser ?

    Quelqu'un aurait-il un exemple simple de l'utilisation ?
    J'ai compris que InvokeRequired testé si on se trouvé dans le bon thread, mais c'est invoke qui me pause problème...

    Désoler je me suis un peu lancé a l'aveuglette dans VB.net...
    Merci d'avance de votre aide, veuillez m'excusez de mon niveau...

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    bonjour,
    essaye de renvoyer une string plutôt et tu l'affectera a ton label sinon tu risques de devoir utiliser l'invoke pour affecter directement ton label

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Tout d'abord un grand merci pour l'attention que vous m'accordez, je ne pensez pas obtenir de réponse a cette heure ci...
    Un grand merci !

    Citation Envoyé par youtpout978 Voir le message
    bonjour,
    essaye de renvoyer une string plutôt et tu l'affectera a ton label sinon tu risques de devoir utiliser l'invoke pour affecter directement ton label
    Je ne comprend pas ce que tu veut dire... Voici le code qui traite le label

    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
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim ipAddr As System.Net.IPAddress
     
            SocketServer = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            ipAddr = IPAddress.Parse("127.0.0.1")
            SocketServer.Bind(New IPEndPoint(ipAddr, 80))
            SocketServer.Listen(1)
            Me.SocketServer.BeginAccept(AddressOf connexionCallback, Me.SocketServer)
        End Sub
     
        Private Sub connexionCallback(ByVal asyncResult As IAsyncResult)
            SocketServer = SocketServer.EndAccept(asyncResult)
            Me.Label1.Text = "Le client est connecté"
        End Sub
    @matll
    J'ai cru comprendre d'après la doc de Microsoft que c'est un événement qui renvoi une donné si le processus est fini ?
    Je doit faire une boucle avec ou il y a une utilisation spéciale ?

    Euh...Maintenant un autre problème me vient...J’établis une connexion socket, si elle est réussi je change le label, mais ce n'est pas pour autant que je veut fermer la connexion, donc le processus ne s’arrête jamais... si ?

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    si ta deux état tu peux déclarer un booléen dans ton application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub connexionCallback(ByVal asyncResult As IAsyncResult)
            SocketServer = SocketServer.EndAccept(asyncResult)
            Me.boolConnect =true
        End Sub
    et tu utlise un timer qui toutes les secondes vérifiera l'état de ton boolean s'il est a true alors tu mettras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.Label1.Text = "Le client est connecté"
    tu mettras bien ça dans l'événement tick du timer

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Oui ceci devrait être mieux au niveau de la gestion des labels ( j'étais resté simple pour les tests.. ) mais...( Je n'ai pas encore testé ) le problème de multi thread restera...non ?

    EDIT :
    Après test, voila le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub connexionCallback(ByVal asyncResult As IAsyncResult)
            Dim SocketConnect As Boolean
     
            SocketServer = SocketServer.EndAccept(asyncResult)
            SocketConnect = True
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If SocketConnect = True Then
                Me.Label1.Text = "Le client est connecté"
            End If
        End Sub
    Plus d'erreur =D Mais plus de mouvement...^^
    Le client capte bien la connexion mais le serveur non...
    Et tant que j'y pense, je ne test pas la connexion toute les 1000ms mais je vérifie si la connexion a bien était établie une fois..

    connexionCallback est simplement appelé une fois la connexion établie, mais elle n'est pas testé...Une idée ?

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Je ne pourrai pas t'aider plus au niveau des sockets je ne les ai jamais utilisé.
    Le faite de ne pas directement renseigné ton label dans ton thread permet d'éviter les erreurs d'accès multi-thread
    http://msdn.microsoft.com/fr-fr/library/ms171728.aspx

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 151
    Par défaut
    Dans un BackGroundWorker tu ne peux (à ma connaissance) pas modifier les élements créés dans d'autre Thread. Pour faire cela, il faut le faire dans l'évenement RunWorkerCompleted. Tu es donc obligé de passer le résultat de ta connexion, dans la variable Result (du DoWorkEventArgs). Tu peux stocker dans cette variable n'importe quel type (ou du moins un grand nombre) de données

    Quant aux InvokeRequired, je passe mon tour, je n'en ai jamais utilisé, mais interessé de savoir à quoi ils peuvent servir.

    Et utiliser BackGroundWorker pour des threads lourds n'est pas forcement obligatoire, je l'utilise aussi pour des threads légers comme affichage de la date et l'heure sur une Form sans perturber le fonctionnement (Timer+BGW)

    EDIT : Petit exemple de BGW :
    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
    Private Sub bgwDateHeure_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwDateHeure.DoWork
            e.Result = MaJDH()
        End Sub
     
        Private Sub bgwDateHeure_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwDateHeure.RunWorkerCompleted
            Dim al As ArrayList = e.Result
            Date_.Text = al(0)
            Heure_.Text = al(1)
        End Sub
     
        Private Function MaJDH() As ArrayList
            MaJDH = New ArrayList
            Dim d As Date = Now 'On récupère l'heure courante
     
            ' On met à jour les affichages
            MaJDH.Add(d.Date)
            MaJDH.Add(d.ToString("HH:mm:ss"))
        End Function
    Et ce code est appelé toutes les 1000ms par un Timer

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Réponses: 2
    Dernier message: 15/05/2004, 18h33
  3. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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