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 :

Affichage dans une TextBox à l'intérieur d'une boucle


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut Affichage dans une TextBox à l'intérieur d'une boucle
    Bonjour,

    Le but est d'afficher dans une TextBox une valeur en cours d'évolution au sein de boucles For.
    La succession des différentes valeurs est très rapide et cela les rend illisibles, mais ça permet de voir que le "compteur" tourne.

    J'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim R As Long = 0
            For i As Integer = 0 To 10
                For j As Integer = 0 To 5000
                    R += i + j
                    TextBox1.Text = R
                    TextBox1.Refresh()
                Next i
            Next j
        End Sub
    Ce code donne bien l'effet attendu grâce à la ligne TextBox1.Refresh(). Sans elle, seule la dernière valeur affectée est visible après le dernier tour de boucle, comme si la ligne TextBox1.Text = R avait été placée après la ligne Next j. Tout cela est bien normal, je le comprends.

    La solution du TextBox1.Refresh() n'est parait-il pas la meilleure.

    Quelqu'un peut-il me donner un exemple de code qui serait une meilleure solution ?

    Merci d'avance,

    Sam

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Pourquoi pas un BackgroundWorker.
    https://glarde.developpez.com/dotnet/bgworker/vb/

  3. #3
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Merci Popo.
    Je vais examiner le BackgroundWorker.
    Mais cela me parait bien lourd à mettre en œuvre pour remplacer un "simple" .Refresh d'un TextBox.
    S'il est facile de me répondre, en quoi cela est-il meilleur ?

    Bonne soirée,

    Sam

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    A toutes fins utiles, la méthode Refresh peut être remplacée par la méthode UpDate :
    Sans connaître l'ampleur de ton application ni le rôle du bout de code que tu donnes en exemple, je ne me hasarderai pas à dire si c'est mieux ou pas,

    Je pense que le meilleur des semi-remorques, le plus beau, le plus économique, le moins polluant, le plus rapide, ..., est inapproprié s'il s'agit de conduire un petit pois de Lille à Marseille, la Poste fera l'affaire de manière aussi rapide et bien plus économique. Par contre, si c'est une cargaison de plusieurs tonnes de petits pois qu'il faut transporter, il faut un transporteur à la hauteur, le semi-remorque en est un, encore faudra-t-il un chauffeur capable de l'utiliser correctement.
    Moralité : il est parfois utile de mettre en œuvre un dispositif "lourd" mais toi seul peut savoir ce qui est meilleur ou non, et cela demande une bonne dose de réflexions.

    ...

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Citation Envoyé par Sam Placi Voir le message
    Mais cela me parait bien lourd à mettre en œuvre pour remplacer un "simple" .Refresh d'un TextBox.
    S'il est facile de me répondre, en quoi cela est-il meilleur ?
    C'est dû à la manière dont fonctionne le Win Form.
    Tout ce qui se passe à l'écran est basé sur des envois de message (à ne pas prendre au sens de courrier ou de mail).
    Ces messages sont traités dans l'ordre où ils sont générés.
    Et lorsque tu fais un Refresh tu rajoute un message "PAINT" dans la pile de message.

    Sauf que le dépilement n'est effectué que lorsqu'on lui laisse le temps de le faire.
    Or tant que boucle, tu empêches ce dépilement.
    Cela signifie que ton Refresh n'est pas sûr de fonctionner.

  6. #6
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Re,

    Intrigué par ton problème, et inspiré par l'échange d'hier entre Popo et Fricad à propos du "textbox en thread", je me suis souvenu d'une forme de multithreading qui ne fait pas appel au BackgroundWorker et de ce fait, est peut-être moins lourde à mettre en œuvre.
    Si ce code te convient il te faudra quand vérifier s'il est fiable dans ton contexte, je n'ai pas une grande expérience de cette programmation.

    Sur un Form contenant un TextBox et un Button, j'ai placé ce code qui permet l'affichage de chaque valeur dans le textBox sans Refresh ni UpDate.
    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
    Public Class Form1
     
        Delegate Sub Affichage(S As String)
     
        Dim AutreThread As System.Threading.Thread = Nothing
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            AutreThread = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf Calcule))
            AutreThread.Start()
        End Sub
     
        Private Sub EcritText(Valeur As String)
            If (TextBox1.InvokeRequired) Then
                TextBox1.Invoke(New Affichage(AddressOf EcritText), New Object() {Valeur})
            Else
                TextBox1.Text = Valeur
            End If
        End Sub
     
        Private Sub Calcule()
            Dim R As Long = 0
            For i As Integer = 0 To 3       ' J'ai diminué tes valeurs de 10 et 5000 pour faire moins long à l'exécution.
                For j As Integer = 0 To 10 
                    R += i + j
                    EcritText(R.ToString)
                    System.Threading.Thread.Sleep(10) ' pour avoir le temps de voir, comme tu le dis : La succession des différentes valeurs est très rapide
                Next
            Next
        End Sub
     
    End Class
    J'espère que ceci te fera avancer ...

  7. #7
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Bonsoir,

    Merci Popo pour les explications. Peut-être que le UpDate indiqué par Phil est plus sûr ?
    J'ai commencé à tester, plutôt essayé de tester, le BackgroundWorker. J'y suis pas loin, je n'ai encore rien qui fonctionne correctement.

    Merci Phil, j'ai bien aimé ton histoire de semi-remorque. Ton code multithread fonctionne, je dois le comprendre.

    Bon week-end à vous deux.

    Sam.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    La différence entre Update et Refresh et est que Update va demander le repaint du composant seul alors que Refresh va également demander le repaint des composants qu'il contient.
    D'ailleurs, il me semble que Refresh appelle Update.

  9. #9
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Merci Popo.

    UpDate serait donc meilleur (ou moins mauvais) que Refresh.
    Assez bêtement, je pensais que UpDate ne concernait que les données lorsqu'il y a un Bindings sur la propriété Text.
    Quant au multithread, il permet donc de "simplement" changer le texte du TextBox là où cela ne se fait tant que le processus en cours n'est pas fini.

    Cela me fait déjà beaucoup d'infos ...

    Je crois bien de clôturer maintenant ce sujet.

    Très bonne journée,

    Sam

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Citation Envoyé par Sam Placi Voir le message
    UpDate serait donc meilleur (ou moins mauvais) que Refresh.
    Cela va dépendre du contexte et du composant.
    Un simple Label n'a pas besoin de rafraichir d'autre composants.
    En revanche, un GroupBox ou une grille en aura potentiellement besoin.

    Ce qu'il faut retenir, c'est que l'un comme l'autre, il vont ajouter un message PAINT dans la pile.
    Et c'est pourquoi on met en place ce genre de technique.

  11. #11
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Bonjour Popo,

    Merci pour cette explication complémentaire.
    Il faut donc toujours évaluer la complexité du dispositif mis en oeuvre et le bénéfice recherché.
    Le UpDate convient parfaitement au TextBox de mon simpliste exemple de départ et je comprends très bien que s'il s'agit d'un ensemble de composants, il faut utiliser le multithreading. Je vais devoir m'entrainer !

    Très bonne journée,

    Sam

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 503
    Par défaut
    une alternative peut-être au backgroundworker, l'utilisation d'un timer qui exécutera un tour de la boucle à chaque interruption

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

Discussions similaires

  1. Problème d'affichage dans une Boucle Foreach
    Par garrix_du77 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 20/07/2017, 14h03
  2. [Google Maps] Affichage dans une boucle
    Par astroma dans le forum APIs Google
    Réponses: 1
    Dernier message: 04/09/2012, 23h25
  3. OneToOne : affichage dans une boucle
    Par golf3gtiii dans le forum Doctrine2
    Réponses: 2
    Dernier message: 14/10/2011, 12h23
  4. Mise en forme de l'affichage dans une boucle
    Par sam01 dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2010, 16h50
  5. Forcer l'affichage dans une boucle
    Par jb36123 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/08/2006, 14h40

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