Utilisation d'un thread pour afficher l'état d'avancement d'un programme

Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 - 26 juil. 2011 à 14:20
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 26 juil. 2011 à 17:12
bonjour,
j'ai un petit problème:
j'ai un programme en windows form qui fonctionne correctement sauf qu'il est trop lent et j'aimerai qu'il m'affiche l'état d'avancement de l'éxecution.
alors je sais qu'il y a la progress bar qui peut faire ça mais je ne maitrise pas les threading et quand je lis les tutos j'ai du mal à comprendre comment l'implémenter concretement sur mon programme.
j'ai décidé donc de faire simple et de créer une textbox ou j'aimerai écrire juste le nombre de ligne traitées sur l'ensemble des lignes disponibles.
le problème c'est qu'il ne m'affiche rien jusqu'à la fin de l'éxecution ou il me met "10/10"
il y'a donc, j'imagine, un thread à lancer afin d'excuter les deux taches en meme temps mais je ne sais pas commet faire :( quelqu'un peut-il m'aider avec un exemple simple de code?
voici pour info le code qui est sensé afficher l'avancement:

int pos = 0;
foreach (KeyValuePair<string, int> oKv in dU)
            {
               prog.Text = "\r"+pos+"/"+limit;
               int code = GetCode(oKv.Key);
               if (rescode == 200)
                   u200++;
               else
                   uH200++;

               oWt.WriteLine("{0}\t{1}\t{2}", oKv.Key, oKv.Value, rescode);
               pos++;
            }

3 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
26 juil. 2011 à 15:28
Salut

Regarde du côté de la classe BackgroundWorker.
Cette classe sert à effectuer une opération dans un thread séparé tout en permettant de transmettre l'avancement au thread graphique.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
26 juil. 2011 à 16:32
merci pour ta réponse mais ca me parrait un peu compliqué :(
tu as l'air de bien t'y connaitre, aurais-tu un bout de code "personnalisé" (oh, j'ai dit un gros mot :)) ou même une petite explication de comment déclarer et utiliser le thread?

merci
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
26 juil. 2011 à 17:12
En fait, l'intérêt du BackgroundWorker, c'est de faire de manière très simple quelque chose d'assez compliqué.

Et plutôt que de te donner un bout de code personnalisé, je préfère te renvoyer vers MSDN. Pour rappel (ou pour info), MSDN est le site officiel de Microsoft concernant le développement. Il contient (entre autres) une description de toutes les classes du Framework.net, avec de nombreux exemples.
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

Pour simplifier :
- Tu crées un BackgroundWorker.
- Tu mets la propriété WorkerReportsProgress à true
- Tu abonnes une méthode à l'événement ProgressChanged (monBackgroundWorker.ProgressChanged += ...)
- Dans cette méthode, tu effectues les opérations graphiques qui ont lieu en fonction de l'avancement (barre de progression, nombre de lignes traitées...)
- Tu abonnes une méthode à l'événement DoWork
- Dans cette méthode, tu effectues les opérations "lourdes"
- Dans cette même méthode, tu appelles la méthode ReportProgress() de ton BackgroundWorker à chaque fois que tu traité, dans ton cas, une ligne.
- Quand tu as fait tout ça, tu n'a qu'à appeler la méthode RunWorkerAsync() de ton BackgroundWorker.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
Rejoignez-nous