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

michlemer Messages postés 8 Date d'inscription mercredi 18 juillet 2007 Statut Membre Dernière intervention 1 décembre 2009 - 5 août 2009 à 22:52
spyroo Messages postés 15 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 26 août 2009 - 26 août 2009 à 15:15
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
6 août 2009 à 00:51
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.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 août 2009 à 23:12
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
*/
0
spyroo Messages postés 15 Date d'inscription jeudi 19 janvier 2006 Statut Membre Dernière intervention 26 août 2009
26 août 2009 à 15:15
Si tu fais un traitement lourd, ne peux tu pas le faire dans un thread à part?
0
Rejoignez-nous