Besoin d'aide... [Résolu]

Signaler
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008
-
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008
-
Bonsoir tout le monde, après mon post sur les backgroundWorker que je n'arrive toujours pas à utiliser je vous demande de l'aide pour finir mon code en le détaillant pour que je comprenne...

Voila le code qui ouvre les fichiers ou dossier, et je voudrais que la progressBar dans le toolstrip travail pendant l'ouverture du fichier ou du répertoire pour ne pas avoir un freeze de la fenetre...merci d'avance

        private void ouvrirFichiersToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            openFileDialog.Title = "";
            openFileDialog.Filter = "Tout les fichiers (*.*)|*.*";
            openFileDialog.Multiselect = true;

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string[] files = openFileDialog.FileNames;
                foreach (string file in files)
                {
                    FileInfo fi = new FileInfo(file);
                    string fileWExt = Path.GetFileNameWithoutExtension(fi.ToString());
                    ListViewItem item = new ListViewItem(fileWExt);
                    double size = fi.Length / 1024;
                    item.SubItems.Add(size.ToString() + " Ko");
                    item.SubItems.Add(fi.Extension);
                    listView1.Items.Add(item);
                }
                columnHeader1.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
                columnHeader2.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
            }
        }

        private void ouvrirDossierToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            folderBrowserDialog.RootFolder = Environment.SpecialFolder.Desktop;
            folderBrowserDialog.Description = "Séléctionner un dossier";
            folderBrowserDialog.ShowNewFolderButton = false;

            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                string[] Spath = Directory.GetFiles(folderBrowserDialog.SelectedPath, "*.*", SearchOption.TopDirectoryOnly);

                foreach (string file in Spath)
                {
                    FileInfo fi = new FileInfo(file);
                    string fileWExt = Path.GetFileNameWithoutExtension(fi.ToString());
                    ListViewItem item = new ListViewItem(fileWExt);
                    double size = fi.Length / 1024;
                    item.SubItems.Add(size.ToString() + " Ko");
                    item.SubItems.Add(fi.Extension);
                    listView1.Items.Add(item);
                }
                columnHeader1.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
                columnHeader2.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
            }
        }

9 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Salut,

Voila un code qui pourra t'aider.
J'ai simplement une Form, avec un bouton, une ListView, et un ToolStripProgressBar, non renommés

A toi de l'adapter pour qu'il reponde a tes attentes ;)
<hr />public

partial
class
Form1 :
Form
{

   public
delegate
void
AddItemEventHandler(
FileInfo fileInfo);

   public
delegate
void
InitProgressBarEventHandler(
int size);

   private
Thread t;

   private
AddItemEventHandler addItemHandler;

   private
InitProgressBarEventHandler initProgressBarHandler;

   public Form1()
   {

      this.addItemHandler =
new
AddItemEventHandler(AddItem);

      this.initProgressBarHandler =
new
InitProgressBarEventHandler(InitProgressBar);
      InitializeComponent();
    }

   public
void AddItem(
FileInfo fi)
   {

      string fileWExt =
Path.GetFileNameWithoutExtension(fi.ToString());

      ListViewItem item =
new
ListViewItem(fileWExt);

      double size = fi.Length / 1024;
      item.SubItems.Add(size +
" ko");
      item.SubItems.Add(fi.Extension);
      listView1.Items.Add(item);

      this.toolStripProgressBar1.PerformStep();
   }

public
void InitProgressBar(
int size)
{

   this.toolStripProgressBar1.Maximum = size;
}

private
void button1_Click(
object sender,
EventArgs e)
{

   using (
FolderBrowserDialog fbd =
new
FolderBrowserDialog())
   {

      if (fbd.ShowDialog() == System.Windows.Forms.
DialogResult.OK && t ==
null)
      {
         t =
new
Thread(
new
ParameterizedThreadStart(FillList));
         t.IsBackground =
true;
         t.Start(fbd.SelectedPath);
      }
   }
}

private
void FillList(
object directory)
{

   try
   {

      string[] files =
Directory.GetFiles(directory.ToString(),
"*.*",
SearchOption.TopDirectoryOnly);

      this.Invoke(
this.initProgressBarHandler, files.Length);

      foreach (
string file
in files)
      {

         FileInfo fi =
new
FileInfo(file);

         IAsyncResult iar =
this.BeginInvoke(
this.addItemHandler, fi);

         this.EndInvoke(iar);
      }
    }

   catch(
ThreadAbortException) { }
  }
}
<hr />

Mx
MVP C# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Tu t'es inscrit a l'evenement Click de ton button ?

Mx
MVP C# 
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Soit tu forces le rafraichissement, mais ta fenetre, elle, reste gelée, soit tu ouvres ton fichier dans un Thread différent. Regardes ca si tu veux : http://www.csharpfr.com/codes/THREADER-SIMPLEMENT-CLASSE-INTERAGIR-AVEC-FORM_42292.aspx

<hr />I love .net
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Afin de ne pas avoir de freeze de la fenêtre principale, il faut que tu exécute ton code dans un Thread. En effet, toutes les actions de l'utilisateur sur la fênetre principale (click boutton par exemple) ont pour effet de figer le rafraichissement de la fenêtre principale.


Une fois ton code dans une nouvelle méthode : tu peux l'appeler dans un thread tout simplement:


using System.Threading;


Thread myThread = new Thread(new ThreadStart(MaMéthode));
myThread.Start();




Par contre, si tu as, par exemple, un traitement qui tourne en parallèle à ta fenêtre et que celui ci doit modifier certains contrôles : progress bar, label, etc... ; il faut que tu feinte un peu plus car si tu essais de modifier directement celui ci tu auras une exception "CrossThread" soulevée. Un thread autre que le thread "principal" (celui qui s'occupe de l'affichage et des actions utilisateurs) ne peut pas modifier un contrôle directement. Il doit alors charger le thread "principal" de le faire à sa place. Pour ce faire, je t'envoie vers une explication très claire de MorpionMx :
http://www.csharpfr.com/tutoriaux/CSHARP-OPERATIONS-CROSS-THREADS-UTILISATION-DELEGATIONS-SYNCHRONES-ASYNCHRONES_174.aspx

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
25
Oups, désolé Yxion, j'avais pas vu ton poste.

Bonne journée

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Merci pour ton aide :)

mais il me dis qu'il y a une erreur ( sur la ligne en rouge ) : Erreur    1    'Thread' est un 'espace de noms' mais est utilisé comme un 'type'

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace Thread
{
    partial class Form1 : Form
    {
        public delegate void AddItemEventHandler(FileInfo fileInfo);
        public delegate void InitProgressBarEventHandler(int size);
        private Thread t;
        private AddItemEventHandler addItemHandler;
        private InitProgressBarEventHandler initProgressBarHandler;

        public Form1()
        {
            this.addItemHandler = newAddItemEventHandler(AddItem);
            this.initProgressBarHandler = newInitProgressBarEventHandler(InitProgressBar);
            InitializeComponent();
        }

        public void AddItem(FileInfo fi)
        {
            string fileWExt = Path.GetFileNameWithoutExtension(fi.ToString());
            ListViewItem item = newListViewItem(fileWExt);
            double size = fi.Length / 1024;
            item.SubItems.Add(size + " ko");
            item.SubItems.Add(fi.Extension);
            listView1.Items.Add(item);
            this.toolStripProgressBar1.PerformStep();
        }

        public void InitProgressBar(int size)
        {
            this.toolStripProgressBar1.Maximum = size;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog fbd = newFolderBrowserDialog())
            {                if (fbd.ShowDialog() System.Windows.Forms.DialogResult.OK && t null)
                {
                    t = newThread(newParameterizedThreadStart(FillList));
                    t.IsBackground = true;
                    t.Start(fbd.SelectedPath);
                }
            }
        }

        private void FillList(object directory)
        {
            try
            {
                string[] files = Directory.GetFiles(directory.ToString(), "*.*", SearchOption.TopDirectoryOnly);
                this.Invoke(this.initProgressBarHandler, files.Length);
                foreach (string file in files)
                {
                    FileInfo fi = newFileInfo(file);
                    IAsyncResult iar = this.BeginInvoke(this.addItemHandler, fi);
                    this.EndInvoke(iar);
                }
            }
            catch (ThreadAbortException) { }
        }
    }
}
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Comme le message le dit : tu as un espace de nom que tu as nommé "Thread", qui entre donc en conflit avec le nom de la classe Thread de la BCL .NET
Donc soit tu définis des alias, soit tu changes l'espace de nom.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Merci pour ta remarque ^^

Donc voila le code qui se génère sans problème :) mais toujours un problème, il se passe rien quand je clic sur le bouton ...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace WindowsApplication3
{
    partial class Form1 : Form
    {
        public delegate void AddItemEventHandler(FileInfo fileInfo);
        public delegate void InitProgressBarEventHandler(int size);
        private Thread t;
        private AddItemEventHandler addItemHandler;
        private InitProgressBarEventHandler initProgressBarHandler;

        public Form1()
        {
            this.addItemHandler = new AddItemEventHandler(AddItem);
            this.initProgressBarHandler = new InitProgressBarEventHandler(InitProgressBar);
            InitializeComponent();
        }

        public void AddItem(FileInfo fi)
        {
            string fileWExt = Path.GetFileNameWithoutExtension(fi.ToString());
            ListViewItem item = new ListViewItem(fileWExt);
            double size = fi.Length / 1024;
            item.SubItems.Add(size + " ko");
            item.SubItems.Add(fi.Extension);
            listView1.Items.Add(item);
            this.toolStripProgressBar1.PerformStep();
        }

        public void InitProgressBar(int size)
        {
            this.toolStripProgressBar1.Maximum = size;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog fbd = new FolderBrowserDialog())
            {
                if (fbd.ShowDialog() == DialogResult.OK)
                {
                    t = new Thread(new ParameterizedThreadStart(FillList));
                    t.IsBackground = true;
                    t.Start(fbd.SelectedPath);
                }
            }
        }

        private void FillList(object directory)
        {
            try
            {
                string[] files = Directory.GetFiles(directory.ToString(), "*.*", SearchOption.AllDirectories);
                this.Invoke(this.initProgressBarHandler, files.Length);
                foreach (string file in files)
                {
                    FileInfo fi = new FileInfo(file);
                    IAsyncResult iar = this.BeginInvoke(this.addItemHandler, fi);
                    this.EndInvoke(iar);
                }
            }
            catch (ThreadAbortException) { }
        }
    }
}
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Ah merci :) c'est tout bon maintenant ^^