Threads :freez de la ProgressBar

Résolu
huberdine Messages postés 158 Date d'inscription samedi 8 février 2003 Statut Membre Dernière intervention 17 juin 2010 - 24 mars 2006 à 17:41
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 - 27 mars 2006 à 21:02
Bonjour,
mon problème est le suivant :
j'ai in Form contenant une ProgressBar, chargée d'afficher l'avancement d'un traitement (long) effectué dans un thread séparé.
Au début, tout fonctionne bien : ma progressBar avence doucement.
Le problème est que au bout de quelques secondes, le Windows From contenant la progressBar freez jusquèa la fin du traitement du thread.
Si quelqun a une idée, je suis preneur.

D'avance merci.

Je suis en FrameWork 1.1 avec Visual Studio 2003 (je n'ai PAS la possibilité d'avoir Visual Studio 2005 et le Framework 2.0 : donc pas de BackgroundWorker)

Le code que j'utilise :

1°) Dans mon Windows Form :

// Classe qui contient la fonction utilisée pour le thread
Correlation cr = new Correlation(this.fichier.Data,this.valeurs);
// Création du thread
monThread = new Thread(new ThreadStart(cr.ThreadLoop));
monThread.Name="Thread1";
// Lancement du thread
monThread.Start();
// On attend la fin du thread
while(monThread.IsAlive)
{
// On récupère l'avancement
this.avancement = cr.Avancement;
// Mise à jour de la ProgressBar
this.progressBarCorrelation.Value = this.avancement;
// Mise à jour du label
this.labelProgression.Text = "Progression : "+this.avancement.ToString()+"%";
// On rafraîchi l'affichage
this.Update();
}

2°) Ma classe Correlation (enfin, une partie seulement) qui gère le thread :

public class Correlation
{
private int pc_avancement;
private DataSet ds;
private string[][] valeurs;

// Constructeur : initialisation des valeurs et de la connexion à la BDD
public Correlation(DataSet d, string[][] s)
{
ds = d;
valeurs = s;
connexionBDD();
}

// Propriété qui permet d'obtenir l'état d'avancement
public int Avancement
{
get
{
return pc_avancement;
}
}

// Méthode appelée pour le thread
public void ThreadLoop()
{
this.pc_avancement = 0;
try
{
// Je met ici mon traitement avec nottement un calcul sur pc_avancement (% du traitement effectué)

}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}

-*- switch -*-

4 réponses

TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
24 mars 2006 à 20:34
DAns ton while , met un Application.DoEvents

::|The S@ib|::
MVP C#.NET
3
huberdine Messages postés 158 Date d'inscription samedi 8 février 2003 Statut Membre Dernière intervention 17 juin 2010
24 mars 2006 à 21:07
Ok, je fais ça lundi. Merci

-*- switch -*-
0
huberdine Messages postés 158 Date d'inscription samedi 8 février 2003 Statut Membre Dernière intervention 17 juin 2010
27 mars 2006 à 10:06
ça marche nikel, merci beaucoup !

-*- switch -*-
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
27 mars 2006 à 21:02
Deriens !

::|The S@ib|:: MVP C#.NET
0
Rejoignez-nous