Besoin d'aide...

Résolu
sliverman Messages postés 83 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 8 juillet 2008 - 3 oct. 2007 à 20:39
sliverman Messages postés 83 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 8 juillet 2008 - 7 oct. 2007 à 17:48
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

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
7 oct. 2007 à 16:52
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# 
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
7 oct. 2007 à 17:41
Tu t'es inscrit a l'evenement Click de ton button ?

Mx
MVP C# 
3
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009
4 oct. 2007 à 09:03
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
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
4 oct. 2007 à 09:17
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
---------------------
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
4 oct. 2007 à 09:18
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
---------------------
0
sliverman Messages postés 83 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 8 juillet 2008
7 oct. 2007 à 17:09
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) { }
        }
    }
}
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2007 à 17:15
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
*/
0
sliverman Messages postés 83 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 8 juillet 2008
7 oct. 2007 à 17:30
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) { }
        }
    }
}
0
sliverman Messages postés 83 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 8 juillet 2008
7 oct. 2007 à 17:48
Ah merci :) c'est tout bon maintenant ^^
0
Rejoignez-nous