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 :

Thread + progressbar + background worker


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Par défaut Thread + progressbar + background worker
    Bonjour,

    J'ai besoin de faire une copie d'un dossier avec progressbar

    je lance la copie via un bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private void button1_Click(object sender, EventArgs e)
            {
    // je cherche la taille totale de mon repertoire -> taille max de ma progressbar
                DirectoryInfo dvd = new DirectoryInfo(main.DVD);
                Int32 taille_tot = Convert.ToInt32(config.Taille_rep(dvd) / main.BufferSize);
                progressBar.Maximum = taille_tot;
    // début de la copie du repertoire
                label_etape.Text = "Copie des fichiers du DVD";
                Copie.copie_DVD(main.DVD, main.rep_Sources, progressBar);
                label_etape.Text = "Copie terminée";
            }
    Pour la copie j'utilise :
    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
     
        public class Copie
        {
            public static void copie_fichier(string f_a_copier, string f_destination, ProgressBar progressbar)
            {
                try
                {
                    System.Diagnostics.Stopwatch stop = System.Diagnostics.Stopwatch.StartNew();
                    using (FileStream inputStream = File.OpenRead(f_a_copier))
                    {
                        using (FileStream outputStream = File.OpenWrite(f_destination))
                        {
                            byte[] bufferWork = new byte[main.BufferSize];
                            byte[] bufferLoad = new byte[main.BufferSize];
                            byte[] bufferTmp;
                            IAsyncResult asyncResult;
     
                            int nbRead = inputStream.Read(bufferWork, 0, bufferWork.Length);
                            while (nbRead > 0)
                            {
                                asyncResult = inputStream.BeginRead(bufferLoad, 0, bufferLoad.Length, null, null);
                                outputStream.Write(bufferWork, 0, nbRead);
                                nbRead = inputStream.EndRead(asyncResult);
    // j'incremente la progressbar
                                progressbar.PerformStep();
     
                                bufferTmp = bufferWork;
                                bufferWork = bufferLoad;
                                bufferLoad = bufferTmp;
                            }
                        }
                    }
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.ToString(), "erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            public static void copie_DVD(string dvd, string rep_dest, ProgressBar progressbar)
            {
                try
                {
                    DirectoryInfo rep = new DirectoryInfo(dvd);
                    if (rep.Exists)
                    {
                        string vrai_rep_dest;
                        if (rep.Root.Name != rep.Name)
                        {
                            vrai_rep_dest = Path.Combine(rep_dest, rep.Name);
                            if (!Directory.Exists(vrai_rep_dest))
                            { Directory.CreateDirectory(vrai_rep_dest); }
                        }
                        else
                        { vrai_rep_dest = rep_dest; }
                        foreach (string d in Directory.GetDirectories(dvd))
                            Copie.copie_DVD(d, vrai_rep_dest,progressbar);
                        foreach (string fichier in Directory.GetFiles(dvd))
                        {
                            string fichier_dest = Path.Combine(vrai_rep_dest, Path.GetFileName(fichier));
     
                            copie_fichier(fichier, fichier_dest,progressbar); 
                        }
                    }
     
                }
                catch (Exception)
                {
                    MessageBox.Show(erreur.affiche_erreur(03), "Erreur ... ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Application.Exit();
                }
            }
        }

    jusqu'ici tout fonctionne bien, ma barre progresse comme il faut.

    maintenant j'aimerais rajouter un bouton annuler
    si j'ai tout bien compris, pour ca je dois mettre ma copie de fichier dans un thread pour pouvoir utiliser le bouton annuler a n'importe quel moment
    mais si je met ma copie dans un thread j'ai un conflit de threads a cause de la progressbar

    donc, si j'ai encore bien compris il faudrait que j'utilise un backgroundworker sur la progressbar pour la faire avancer, le problème c'est que j'utilise un progressbar.PerformStep() et je vois vraiment pas mettre ca dans un backgroundworker

    en clair je suis totalement perdu, ca fait un moment que je tourne en rond et j'ai vraiment besoin qu'on me guide un peu.
    Donc voila.

    merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Il faut effectivement que tu exécutes ta copie sur un autre Thread. Bien évidemment, tu vas obtenir une erreur avec la progressbar.
    Pour ne plus l'avoir, il faut utiliser InvokeRequired et Invoke (http://msdn.microsoft.com/en-us/libr...erequired.aspx)

    Un petit exemple maison :

    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
     
    // Teste pour savoir si un invoke est nécessaire pour interagir avec la datagridview dgvPays
    if (dgvPays.InvokeRequired)
    // Pour interagir car le DatagridView dgvPays il faut faire un invoke
    {
    	// On utilise un délégué "anonyme"
    	dgvPays.Invoke((MethodInvoker)delegate
    	{
    		// Opérations de mise à jour du datagridview dgvPays
     
    		// Ajout des nouveaux éléments
    		vObjects.ForEach(x => ((BindingSource)dgvPays.DataSource).Add(x));
    		// Suppression des éléments supprimés
    		vDeletedItems.ForEach(x =>
    			((BindingSource)dgvPays.DataSource).Remove(((List<VO_Pays>)((BindingSource)dgvPays.DataSource).DataSource).Find(y => y.Id == x)));
    	});
    }
    else
    {
    // Je fais rien car inutile dans mon cas car je suis toujours dans un thread à part
    }
    Bon courage

Discussions similaires

  1. Background worker et objets créés à l'interieur du second thread
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 13
    Dernier message: 16/02/2009, 17h22
  2. Connexion LDAP et Background worker
    Par javaboy dans le forum VB.NET
    Réponses: 2
    Dernier message: 21/05/2008, 09h17
  3. [Stratégie] connexion a la base avec JDialog thread progressbar
    Par jeffciara dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 25/02/2008, 02h35
  4. arret Background worker thread
    Par ricky78 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/02/2007, 12h15
  5. [MFC] dialog & thread & progressbar
    Par Tigris94 dans le forum MFC
    Réponses: 4
    Dernier message: 05/04/2005, 15h51

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