Utilisation d'un thread pour afficher l'état d'avancement d'un programme
Karibot
Messages postés89Date d'inscriptionmardi 19 janvier 2010StatutMembreDernière intervention21 juin 2016
-
26 juil. 2011 à 14:20
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 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++;
}
A voir également:
Utilisation d'un thread pour afficher l'état d'avancement d'un programme
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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é. -
Karibot
Messages postés89Date d'inscriptionmardi 19 janvier 2010StatutMembreDernière intervention21 juin 20162 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?
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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é. -