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

C# Discussion :

afficher une ProgressBar pour une fonction


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut afficher une ProgressBar pour une fonction
    Bonjour à tous,

    Au démarrage de mon application je charge des paramètres dans une base de données. Ce chargement prends un certain temps et mon application freeze +-1min.

    J'aimerai afficher une progressBar afin de faire patienter l'utilisateur.

    Pouvez-vous m'expliquer le principe ?

    Merci d'avance,

    Voici mon code.

    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
    private void LoadModelCodeInDB()
            {
                int flag, NbrModelCode;
     
                flag = 0;
                NbrModelCode = 0;
     
                lectureFichier(FichierConfig);
     
                // On ajoute tout les testeurs
                foreach (DataRow row in maTable.Rows) // Loop over the rows.
                {
                    foreach (string item in row.ItemArray) // Loop over the items.
                    {
                        if (item == "[TESTER]")
                        {
                            flag = 1;
                        }
                        if (item == "[/TESTER]")
                        {
                            flag = 0;
                        }
     
                        if (flag == 1 && item != "[TESTER]")
                        {
                            TreeNode treeNode = new TreeNode(item);
                            treeView1.Nodes.Add(treeNode);
                        }
                    }
                }
     
                // On ajoute tous les modeles codes
                foreach (TreeNode Tester in treeView1.Nodes)
                {
                    using (var db = new DataClasses1DataContext())
                    {
                        try
                        {
                            var md = (from m in db.vwModelOptionsSmall2s
                                      orderby m.Project, m.ModelCode
                                      select m);
     
                            NbrModelCode = md.Count();
                            progressBar1.Maximum = NbrModelCode;
                            progressBar1.Value = 0;
                            int i =0;
     
                            foreach (var m in md)
                            {
                                i++;
                                TreeNodeCollection parentNode;
                                if (Tester.Nodes.ContainsKey(m.Project))
                                    parentNode = Tester.Nodes[m.Project].Nodes;
                                else
                                    parentNode = Tester.Nodes.Add(m.Project, m.Project).Nodes;
     
                                parentNode.Add(m.ModelCode);
                                progressBar1.Value = i;
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }
                }
            }

  2. #2
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 71
    Points : 110
    Points
    110
    Par défaut
    Salut,

    Cherches du côté du BackgroundWorker

  3. #3
    Membre régulier Avatar de eti1203656
    Homme Profil pro
    Développeur C#
    Inscrit en
    Octobre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2009
    Messages : 30
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    En effet tu peux utiliser l’événement ProgressChanged d'un BackgroundWorker.

    Voici quelque liens:

    http://www.codeproject.com/Tips/8331...ogressBar-demo
    http://glarde.developpez.com/dotnet/bgworker/cs/

    Meilleures salutations

    Etienne

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    Merci pour vos réponses.
    J'ai réussi à mettre mon code dans un thread.
    Apparemment, le thread se lance bien mais il m'affiche cette erreur :

    The action being performed on this control is being called from the wrong thread. You must marshal to the correct thread using Control.Invoke or Control.BeginInvoke to perform this action.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     private void FormGeneratorOfStepsFiles_Shown(object sender, EventArgs e)
            {
                // On va charger les modèles codes dans le treeview
                backgroundWorkerDBStepsFiles.RunWorkerAsync();
     
                while (this.backgroundWorkerDBStepsFiles.IsBusy == true)
                {
                    Application.DoEvents();
                }
            }
    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
    private void backgroundWorkerDBStepsFiles_DoWork(object sender, DoWorkEventArgs e)
            {
                // On ajoute tous les modeles codes
                foreach (TreeNode Tester in treeView1.Nodes)
                {
                    using (var db = new DataClasses1DataContext())
                    {
                        try
                        {
                            var md = (from m in db.vwModelOptionsSmall2s
                                      orderby m.Project, m.ModelCode
                                      select m);
     
                            foreach (var m in md)
                            {
                                TreeNodeCollection parentNode;
                                if (Tester.Nodes.ContainsKey(m.Project))
                                    parentNode = Tester.Nodes[m.Project].Nodes;
                                else
                                    parentNode = Tester.Nodes.Add(m.Project, m.Project).Nodes;
     
                                parentNode.Add(m.ModelCode);
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }
                }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void backgroundWorkerDBStepsFiles_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
     
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      private void backgroundWorkerDBStepsFiles_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
     
            }

  5. #5
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 71
    Points : 110
    Points
    110
    Par défaut
    Salut,

    en fait le souci vient du fait que tu tente de mettre à jour l'interface graphique de ton application à partir du thread du backgroundWorker.
    C'est interdit.
    il faut que tu utilise l’événement ProgressChaged et la méthode ReportProgress (dans DoWork)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    En faite ici, je n'ai pas encore intégré ma progressbar.
    J'ai juste mis ma fonction dans le thread.

    Cependant ma fonction permet de mettre à jour mon treeview.
    Je comprends que je ne peux pas mettre a jour mon interface a partir du thread mais comment faire dans ce cas ?
    Si je met ma fonction dans processchange je n'ai plus d'erreur mais il ne se passe rien.

  7. #7
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 71
    Points : 110
    Points
    110
    Par défaut
    Dans ton DoWork, il faut que tu remplace le code qui met à jour ton interface graphique par
    backgroundWorkerDBStepsFiles.ReportProgress(xxxxxx)Cette méthode lance l’évènement ProgressChange.
    Tu récupère dans cet évènement des choses dans "e"
    Tu commence par indiquer un chiffre qui va te permettre d'avoir l'état d'avancement.
    Utilise ce chiffre comme indicateur d'action :
    1000 = mise à jour d'un node
    1001 = autre chose
    etc...
    Ensuite dans la méthode ReportProgress tu peux passer un "object", de tête dans UserState...
    Tu le récupère dans l’évènement.

    Le mieux est que tu cherche un tuto sur BackgroundWorker.
    Exemple : http://www.dreamincode.net/forums/to...orker-in-c%23/

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/09/2011, 22h53
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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