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 d'affichage dans un textbox depuis l'ajout d'un thread


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 33
    Par défaut Problème d'affichage dans un textbox depuis l'ajout d'un thread
    Bonjour,

    Je développe avec visual studio 2010, framework 4.

    J'ai un formulaire nommé "FrmMaj.vb" et une classe "FaireMaj.vb"

    Ma classe effectue tout le traitement nécessaire et je veux écrire ce que j'ai mis à jour dans un textebox de mon formulaire. Cependant tout fonctionnait bien jusqu'à ce que j'ajoute un thread dans mon code. Depuis le traitement ce fait correctement, mais rien n'apparait dans mon textbox.

    Dans FrmMaj.vb
    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
    Partial Class FrmMaj
     
       Delegate Sub dUpdateVersion()
       Delegate Sub dUpdateComposante(ByVal arListComposante As ArrayList)
     
       Private Sub btnMaj_Click(sender As System.Object, e As  System.EventArgs) Handles btnMaj.Click
            Dim t As New Thread(AddressOf Exec)
            t.IsBackground = True
            t.Start()
       End Sub
     
       Private Sub Exec()
          Dim strPath As String
          Dim arListComposante As ArrayList = New ArrayList
     
          faireMaj = New FaireMaj
     
          cbxVersion.Invoke(New dUpdateVersion(AddressOf UpdateVersion))
     
          lbxComposante.Invoke(New dUpdateComposante(AddressOf UpdateComposante), arListComposante)
     
          faireMaj.Exec(arListComposante, strVersionMajeur, strPath)
       End Sub
     
       Private Sub UpdateVersion()
            strVersionMajeur = cbxVersion.Text
        End Sub
     
        Private Sub UpdateComposante(ByVal arListComposante As ArrayList)
            For Each composante As Object In lbxComposante.SelectedItems
                arListComposante.Add(composante)
            Next
        End Sub
    End Class
    Et dans FaireMaj.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Class FaireMaj   
       Public Sub Exec(ByVal arListComposante As ArrayList, ByVal strVersionMajeur As String, Optional strPath As String = PATH_XML)
          FrmMaj.tbxSortie.AppendText("Traitement en cours" & vbCrLf) 'C'est ici que rien ne s'affiche
          '...
          '...
          '...
       End Sub
     
    End Class
    Quelqu'un pourrait m'aider svp?

    Merci!

  2. #2
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Salut,

    Ta essayé de passer ton textbox en référence a ta fonction?

    Je ne suis pas expert avec les thread mais comme c'est 'externe' à ton formulaire principale, il à peut-être besoin d'une référence explicite au textbox!

    Bye bye

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 33
    Par défaut
    Je pourrais essayer mais passer des contrôles en paramètre ce n'est pas une très bonne façon de programmer :S J'aimerais mieux une autre façon de résoudre mon problème. Mais merci de m'avoir donnée une solution c'est apprécié

  4. #4
    Invité
    Invité(e)
    Par défaut
    Regarde ce que t'indique ta fenêtre de sortie.

    Cela pourrait venir d'un problème d'inter-thread. Peut etre qu'un ivoke pourrait resoudre ton problème.

  5. #5
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Lorsque tu as un Contrôle il est instancié seulement dans ton thread principal.

    Et il n'acceptera pas qu'un autre thread vienne modifier ses propriétés.
    Car sinon ça génère des exceptions d'accès concurrent.

    Théoriquement, tu utilises un thread a part, pour faire un traitement, pas pour agir sur tes contrôles.

    L'idéale c'est d'utiliser une variable globale entre ton thread principale qui va lire cette variable (par exemple le texte) et mettre a jour ton textbox, et un thread de traitement qui va écrire dans cette variable.

    Pour pouvoir faire une actualisation de ce textbox, tu peux, dans ton thread principale, tu créer un timer qui va lire cette variable tout les x secondes.

  6. #6
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Bonjour,

    Pour faire "propre" et éviter d'utiliser les InvokeLater et tout ce genre de chose,
    une classe à été faite exprès pour faciliter ce genre de tache, le BackGroundWorker.

    Msdn

    Tuto DVP

    Comme le signalais mactwist69 on ne peut pas modifier un contrôle à partir d'un autre Thread que celui dédié à l'UI.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/02/2014, 09h00
  2. Problème d'affichage dans les textbox
    Par popinenhbourg dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 28/02/2006, 12h09
  3. Problème d'affichage dans les textbox
    Par popinenhbourg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 28/02/2006, 11h36
  4. Problème d'affichage dans un composant TScrollBox
    Par erossi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/09/2005, 11h29
  5. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00

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