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

Windows Forms Discussion :

Backgroundworker problème avec l’évènement Progresschanged


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Points : 560
    Points
    560
    Par défaut Backgroundworker problème avec l’évènement Progresschanged
    Bonjour,
    voilà j'ai un traitement qui se fait à l'ouverture d'une fenêtre, et je souhaitais rajouter un petit affichage sur l'avancée du traitement.


    Voici avant tout, la petite form que j'ai créé permettant d'afficher l'avancée d'un traitement :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
        public partial class Ouverture : Form
        {
            private int _progression = 0;        
            public int Progression
            {
                get
                {                
                        return _progression; 
                }
                set
                {                
                        _progression = value;
                }
            }
     
            public Ouverture()
            {
                InitializeComponent();            
            }
     
     
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                int ProgressionAffiche = 0;
                while (Progression < 100)
                {
                    if (ProgressionAffiche != Progression)
                    {
                        backgroundWorker1.ReportProgress(Progression);
                        System.Diagnostics.Debug.WriteLine("ReportProgress");
                        ProgressionAffiche = Progression;
     
                    }
                    System.Diagnostics.Debug.WriteLine("Sleep");
                    Thread.Sleep(300);
                }
     
            }
     
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                progressBar1.Value = e.ProgressPercentage;
                System.Diagnostics.Debug.WriteLine(" progressBar1Value -> "+progressBar1.Value);
            }
     
            private void Ouverture_Load(object sender, EventArgs e)
            {
                backgroundWorker1.RunWorkerAsync();
            }
     
        }
    A noter que, j’implémenterais un système de lock sur ma propriété Progression, mais j'aimerais qu'avant tout chose, ma barre de progression ... progresse ... x)

    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
     
     private void Load_Groupe()
     {
                Form_Messages.Ouverture ouv = new CAC.Form_Messages.Ouverture();
                ouv.Show();
     
                Decimal total = Decimal.Parse(GroupeAModifier.Groupes_Prestations_Tiers.Count.ToString());
                Decimal pro = 0;
     
     
     //ma boucle avec le traitement
    foreach (Groupes_Prestations_Tier tier in GroupeAModifier.Groupes_Prestations_Tiers.OrderBy(ti => ti.Tier.NumClient))
                {
     
                        //Traitement en lui même, qui n' a pas d'importance dans ce cas de figure)
     
                        Decimal dec = ((Decimal)pro / total) * 100;
                        ouv.Progression = (int)dec;
                        System.Diagnostics.Debug.WriteLine("Progression : " + (int)dec);
                        pro++;
                    }
                }
     
                ouv.Close();
     }
    Le résultat actuel, est que ma form de progression s'affiche bien, cependant l’évènement ProgressChanged semble ne s’exécuter qu'après que l'évènement DoWork soit complètement terminé (ce qui évidemment, empêche ma ProgressBar d'afficher la progression , comme le montre l'output de la console de Debug :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
     
    Sleep
    Sleep
    Progression : 0
    Progression : 1
    Progression : 2
    ReportProgress
    Sleep
    Progression : 3
    Progression : 5
    Progression : 6
    ReportProgress
    Sleep
    Progression : 7
    Progression : 8
    Progression : 10
    ReportProgress
    Sleep
    Progression : 11
    Progression : 12
    ReportProgress
    Sleep
    Progression : 13
    Progression : 15
    Progression : 16
    ReportProgress
    Sleep
    Progression : 17
    Progression : 18
    Progression : 20
    ReportProgress
    Sleep
    Progression : 21
    Progression : 22
    Progression : 23
    ReportProgress
    Sleep
    Progression : 25
    Progression : 26
    Progression : 27
    ReportProgress
    Sleep
    Progression : 28
    Progression : 30
    Progression : 31
    ReportProgress
    Sleep
    Progression : 32
    Progression : 33
    Progression : 35
    ReportProgress
    Sleep
    Progression : 36
    Progression : 37
    Progression : 38
    ReportProgress
    Sleep
    Progression : 40
    Progression : 41
    Progression : 42
    ReportProgress
    Sleep
    Progression : 43
    Progression : 45
    Progression : 46
    ReportProgress
    Sleep
    Progression : 47
    Progression : 48
    ReportProgress
    Sleep
    Progression : 50
    Progression : 51
    Progression : 52
    ReportProgress
    Sleep
    Progression : 53
    Progression : 55
    Progression : 56
    ReportProgress
    Sleep
    Progression : 57
    Progression : 58
    Progression : 60
    ReportProgress
    Sleep
    Progression : 61
    Progression : 62
    ReportProgress
    Sleep
    Progression : 63
    Progression : 65
    Progression : 66
    ReportProgress
    Sleep
    Progression : 67
    Progression : 68
    Progression : 70
    ReportProgress
    Sleep
    Progression : 71
    Progression : 72
    Progression : 73
    ReportProgress
    Sleep
    Progression : 75
    Progression : 76
    Progression : 77
    ReportProgress
    Sleep
    Progression : 78
    Progression : 80
    Progression : 81
    ReportProgress
    Sleep
    Progression : 82
    Progression : 83
    Progression : 85
    ReportProgress
    Sleep
    Progression : 86
    Progression : 87
    Progression : 88
    ReportProgress
    Sleep
    Progression : 90
    Progression : 91
    Progression : 92
    ReportProgress
    Sleep
    Progression : 93
    Progression : 95
    Progression : 96
    ReportProgress
    Sleep
    Progression : 97
    Progression : 98
     progressBar1Value -> 2
     progressBar1Value -> 6
     progressBar1Value -> 10
     progressBar1Value -> 12
     progressBar1Value -> 16
     progressBar1Value -> 20
     progressBar1Value -> 23
     progressBar1Value -> 27
     progressBar1Value -> 31
     progressBar1Value -> 35
     progressBar1Value -> 38
     progressBar1Value -> 42
     progressBar1Value -> 46
     progressBar1Value -> 48
     progressBar1Value -> 52
     progressBar1Value -> 56
     progressBar1Value -> 60
     progressBar1Value -> 62
     progressBar1Value -> 66
     progressBar1Value -> 70
     progressBar1Value -> 73
     progressBar1Value -> 77
     progressBar1Value -> 81
     progressBar1Value -> 85
     progressBar1Value -> 88
     progressBar1Value -> 92
     progressBar1Value -> 96
    je tiens à signaler, que l'attachement de mes events sont fait correctement et que la propriété WorkerReportsProgress de mon BackGroundWorker est bien mis à True.

    Avez vous une idée de l'origine du problème ?

    Merci d'avance !

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Points : 560
    Points
    560
    Par défaut
    Je viens de faire un petit projet de test :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    public partial class Form1 : Form
        {
            private int _progression=0;
            public int Progression
            {
                get
                {
                    return _progression;
                }
                set
                {
                    _progression = value;
                }
            }
            public Form1()
            {
                InitializeComponent();
            }
     
            private void buttonPlusUn_Click(object sender, EventArgs e)
            {
                Progression++;
                RefreshText();
            }
     
            private void buttonMoinsUn_Click(object sender, EventArgs e)
            {
                Progression--;
                RefreshText();
            }
     
            private void buttonPlusDix_Click(object sender, EventArgs e)
            {
                Progression = Progression + 10;
                RefreshText();
            }
     
            private void buttonMoinsDix_Click(object sender, EventArgs e)
            {
                Progression = Progression - 10;
                RefreshText();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                backgroundWorker1.RunWorkerAsync();
                RefreshText();
            }
     
            private void RefreshText()
            {
                textBox1.Text = Progression.ToString();
            }
     
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                int ValeurAffiche = 0;
                while (true)
                {
                    if (ValeurAffiche != Progression)
                    {
                        if (Progression >= 0 && Progression <= 100)
                        {
                            backgroundWorker1.ReportProgress(Progression);
                            ValeurAffiche = Progression;
                        }
                    }
                    Thread.Sleep(100);
                }
            }
     
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                progressBar1.Value = e.ProgressPercentage;
            }
        }
    Et la tout se passe bien, je ne vois pas ce qui change par rapport à mon code du dessus ... Ma progressbar varie bien en fonction de la Progression.

    Ca doit être très certainement une bêtise ou encore une erreur de conception mais là je dois dire que je vois pas ...

  3. #3
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    C'est probablement parce que ton thread principal (le UI, donc) est fort occupé => il n'a pas le temps de gérer les évènements (en gros, pour simplifier).
    Alors soit tu fais ce gros traitement en backgroud (ce qui me semble le plus indiqué, c'est fait pour ça), soit tu rajoutes un Application.DoEvents() après le pro++;, par exemple, mais c'est la solution de facilité qui peut avoir des effets de bord . Voir discussion http://www.developpez.net/forums/d11...ceci-question/
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Points : 560
    Points
    560
    Par défaut
    J'avais déjà essaye le
    Application.DoEvents mais malheureusement cela ne fonctionnait pas. Je vais ressayer

    Aussi non oui habituellement je fais mes traitements dans le backgroundworker mais je voulais essayer de voir si il était possible de l'utiliser uniquement pour montrer l'avancée d'un traitement à l'utilisateur car à certains moments, ce n'est pas grave si l'interaction est bloquée pendant le traitement.

    En tout cas merci pour ton post !

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/10/2008, 09h48
  2. Problème avec BackgroundWorker
    Par supasonic77 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/06/2007, 11h40
  3. [C# THREADS]problème avec backgroundworker
    Par sarapis dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/04/2007, 11h58
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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