Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rafraichir une ListBox pendant un long traitement

... et pas à la toute fin

Sujet résolu
    21 mai 2013 à 15:35:33

    Bonjour à tous,

    - J'ai fait une appli en C# qui permet de supprimer les doublons d'une liste qu'on copie-colle dans une RichTextBox. Le traitement est un peu lourd (deux boucles "for" imbriquées), surtout quand la liste saisie est longue ; mais il fonctionne.

    - J'ai ajouté une ProgressBar qui s'incrémente à chaque passage dans la boucle, et cela marche très bien.

    - Je souhaite également ajouter un label qui serait modifié à chaque passage dans la boucle, exactement au même endroit que la ProgressBar. Mais (et c'est la que ça cloche) le label ne se rafraichit pas pendant le traitement. Or, le code est bon car si je fais la même chose en remplaçant le label par un Message.Show, j'ai bien ce que je veux.

    - Je pense que c'est dû au fait que le traitement demande beaucoup de travail au processeur, ce qui ne laisse plus de place pour le rafraichissement du label. Une solution que j'ai trouvée sur un forum est d'utiliser des Threads, mais je ne suis pas trop chaud, étant donné que le fonctionnement n'est pas approprié à mon code (en effet, de ce que j'en ai compris, il faut que le traitement lourd soit dans une procédure, et qu'il ne manipule pas de contrôles, ce qui n'est pas trop mon cas...).

    Mes questions sont donc :

    => Suis-je sur la bonne piste quant à la cause de mon problème ?

    => Si oui, Y-a-t-il un moyen autre que les Threads pour pallier à ce problème ?

    => Si non, pourriez-vous m'indiquer comment utiliser les Threads alors que la procédure qui fait le long traitement manipule des contrôles ?

    Merci de votre aide...

    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2013 à 16:06:40

      Salut, 

      Tu as, en effet, mis le doigt sur le problème. Plus précisément, le traitement que tu demandes bloque le thread courant qui se trouve être le même que celui qui gère l'interface graphique. Du coup, l'IG n'est mise à jour qu'à la fin du traitement, et puisque je suppose que tu exécutes ce traitement dans un évènement, à la sortie de l'événement.

      Je ne vois pas d'autre solution que les threads (malheureusement). Si ce n'est peut-être le backgroundworker, je ne l'ai jamais vraiment utilisé car il est (très) souvent déconseillé à cause de sa non-flexibilité : tu ne peux pas le manipuler aisement et en faire ce que tu veux, comme tu pourrais le faire en implémentant toi même un code gérant plusieurs threads.

      Je te conseille donc de lire ceci. Tu remarqueras que pour résoudre le problème de la manipulation de contrôles dans un thraed différent de celui gérant leur initialisation, on utilise les delegates.

      Voila, moi je t'ai proposé une solution, tu la suis si tu veux, tu peux creuser de ce coté en hésitant pas à poser une question plus précise concernant les threads en postant un code qui illustre (ou contienne) ton problème.

      J'espère t'avoir aider :)

      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2013 à 16:45:18

        Si c'est vraiment ca, alors dans le meme genre je proposerai plutot un BackgroundWorker qu'un Thread que tu sauras gerer correctement(bien que, en le parametrant en background = true et sans trop de priorite ca reviendra plus ou moins au meme... de loin), si ca doit mettre a jour un element de l'UI va falloir mettre des Invoke() [oui ca peut manipuler des controls faut juste faire attention sinon tu auras des exceptions du style, "Hey mec touche pas a mon thread UI, t'es qu'un vulgaire Thread de process, manan va ! (orthographe a checker)"].

        Je suis curieux du comportement, pourrais-tu poser un snippet ? Ce qui m'interpelle c'est ce que tu decris de l'UI (ou "lui" pour les intimes) l'appel Show() de MessageBox est tout aussi bloquant qu'un changement dans l'UI... qu'un traitement soit lourd, okay mais la facon dont est decrit le probleme, ca a l'air bien procedural...

        Agent J a écrit:

        Bonjour à tous,

        - J'ai fait une appli en C# qui permet de supprimer les doublons d'une liste qu'on copie-colle dans une RichTextBox. Le traitement est un peu lourd (deux boucles "for" imbriquées), surtout quand la liste saisie est longue ; mais il fonctionne.

        - J'ai ajouté une ProgressBar qui s'incrémente à chaque passage dans la boucle, et cela marche très bien.

        - Je souhaite également ajouter un label qui serait modifié à chaque passage dans la boucle, exactement au même endroit que la ProgressBar. Mais (et c'est la que ça cloche) le label ne se rafraichit pas pendant le traitement. Or, le code est bon car si je fais la même chose en remplaçant le label par un Message.Show, j'ai bien ce que je veux.

        - Je pense que c'est dû au fait que le traitement demande beaucoup de travail au processeur, ce qui ne laisse plus de place pour le rafraichissement du label. Une solution que j'ai trouvée sur un forum est d'utiliser des Threads, mais je ne suis pas trop chaud, étant donné que le fonctionnement n'est pas approprié à mon code (en effet, de ce que j'en ai compris, il faut que le traitement lourd soit dans une procédure, et qu'il ne manipule pas de contrôles, ce qui n'est pas trop mon cas...).



        • Partager sur Facebook
        • Partager sur Twitter
          21 mai 2013 à 18:41:28

          Merci à vous deux pour vos réponses, elles me sont d'une grande aide.

          @stephan1932 : Je vais creuser au niveau des Threads grâce au tuto, c'est un concept que j'aimerais maîtriser, car ça me semble utile. Par contre je ne suis qu'un pauvre débutant, j'espère que mon cerveau sera capable de comprendre ^^. Je reviendrai ici pour poser toutes mes questions si questions il y a.

          @LiYiWan : Oui, j'avais essayé d'utiliser les Threads grossièrement, mais j'ai préféré venir demander de l'aide dès que je me suis pris ce fameux message ! Je posterai mon code une fois chez moi.

          • Partager sur Facebook
          • Partager sur Twitter
            1 juin 2013 à 20:47:56

            J'ai réussi à résoudre mon problème grâce... Aux threads ! Pas facile à mettre en place pour un débutant, c'est assez complexe. Mais avec le tuto en appui, ça va.

            Bref, merci pour votre aide !

            • Partager sur Facebook
            • Partager sur Twitter
              12 octobre 2020 à 9:38:54

              Merci pour votre histoire ! Après des épreuves si difficiles, vous pourriez vous bien reposer et vous recharger en énergie. Quand on m’a fait une rhinoplastie, j’étais aussi très contente de résultats. Mais j’étais psychologiquement épuisée ! Un cap de massage dorsal m’a aidé beaucoup https://boostyrteam.com/osteopathe-geneve/. Je conseille à tout le monde de s’offrir quelque chose comme ca pour se soulager des périodes difficiles après la cure médicale ou une intervention chirurgicale. Bonne santé !

              -
              Edité par LiamNolan 14 octobre 2020 à 9:34:02

              • Partager sur Facebook
              • Partager sur Twitter
                12 octobre 2020 à 11:51:30

                De quels thèmes parlez-vous ???

                C'est quoi le rapport avec la question initiale (d'il y a plus de 7 ans, BORDEL).

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                Rafraichir une ListBox pendant un long traitement

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown