Visual C#: fenetre ne se redessine pas si traitement en cours

Signaler
Messages postés
8
Date d'inscription
mercredi 18 juillet 2007
Statut
Membre
Dernière intervention
1 décembre 2009
-
Messages postés
15
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
26 août 2009
-
Bonjour,

Lorsque mon appli fait un traitement assez lourd en arriere, la fenetre de mon appli ne se redessine pas lorsque je la deplace.
Est-ce que quelqu'un aurait une idée?

Merci.
Michel

3 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, le thread principal de la forme est occupé, les traitements longs doivent se faire dans un autre thread, voir la classe Thread ou la classe BackgroundWorker. Et pour les cas de figure assez simples la fonction Application.DoEvent est pratique.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Bonjour,

Attention tout de même avec Application.DoEvents : veiller plus que jamais à écrire le code des gestionnaires d'évènements (plus particulièrement celui de ceux qui sont déclenchés par le traitement de messages) code de façon réentrante, sinon gare aux bugs. Un peu comme avec un traitement multithreadé mais en plus vicieux car on ne s'attend pas forcément à une exécution "parallèle" sur ce coup là.

Exemple simple (poser un Button "button1" et un ListBox "listBox1" sur le formulaire et y reproduire un code similaire à celui-ci) :
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Int32 clickCount = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            Int32 clickCountBefore = this.clickCount;

            for (Int32 i = 0; i < 10; i++)
            {
                Thread.Sleep(100);
                Application.DoEvents();
            }

            Int32 clickCountAfter = this.clickCount;

            if (clickCountAfter != clickCountBefore)
            {
                this.listBox1.Items.Insert(0, "Ouch...");
            }

            this.clickCount++;

            this.listBox1.Items.Insert(0, this.clickCount.ToString());
        }
    }



Et cliquer plusieurs fois de suite sur button1 comme le permet maintenant l'utilisation de DoEvents.
La sortie devrait parler d'elle même


/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
15
Date d'inscription
jeudi 19 janvier 2006
Statut
Membre
Dernière intervention
26 août 2009

Si tu fais un traitement lourd, ne peux tu pas le faire dans un thread à part?