sliverman
Messages postés83Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention 8 juillet 2008
-
3 oct. 2007 à 20:39
sliverman
Messages postés83Date d'inscriptionvendredi 17 juin 2005StatutMembreDerniè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
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);
}
}
}
billou_13
Messages postés860Date d'inscriptionjeudi 4 mars 2004StatutMembreDernière intervention19 août 201429 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
---------------------
Vous n’avez pas trouvé la réponse que vous recherchez ?
billou_13
Messages postés860Date d'inscriptionjeudi 4 mars 2004StatutMembreDernière intervention19 août 201429 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
---------------------
sliverman
Messages postés83Date d'inscriptionvendredi 17 juin 2005StatutMembreDerniè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;
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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.
sliverman
Messages postés83Date d'inscriptionvendredi 17 juin 2005StatutMembreDerniè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();
}