Bonjour à tous*;
Suis sous Seven avec 8GO Ram 1TO en DD …
Je fais de la petite programmation sous Visual Studio 2008 Standart en C#.
Dans un formulaire WindowsForm … entre autre une Listbox nommé lb_util où j'écris le déroulement des actions du programme. C'est là que se situe le problème.
But du programme*: lancer des décompressions de fichiers. Chaque décompression est exécuté par un Thread différent.
J'ai fait plusieurs essais*:
1) Essai par Utilisation d'un tableau de Thread (t_thread[]) où chaque thread est lancé pour exécuter la méthode «* decompresser()*». Cette dernière méthode doit signaler son action par écriture dans la ListBox.
morceaux de code
…............// methode pour decompresser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // lancement d'un thread Arg_decompress arg_decompress = new Arg_decompress(i, fichier); // arguments t_thread[i] = new Thread(new ParameterizedThreadStart(this.decompresser)); t_thread[i].Start(arg_decompress);
Si je supprime l'appel du délégué (Invoke) le programme est OK.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void... decompresser(objet data) { // déclaration et init d'un délégué de type Del_affich chargé décrire dans la ListBox (méthode Invoke() ) // la méthode "del_method_aff_lb() est appelée par le délégué ... Del_affich del_af_lb = new Del_affich(del_method_aff_lb); this.lb_util.Invoke(del_af_lb, txt); // c'est là que ça plante grave .... } // methode exécutée par le délégué sur la ListBox public void del_method_aff_lb(string t) { ...this.lb_util.Items.Add(t); ......}
2) Essai par utilisation d'un pool de Thread (ThreadPool) au lieu du tableau de Thread
Le reste du code ne change pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 .... ThreadPool.QueueUserWorkItem(new WaitCallback( decompresser ), arg_decompress); ....
Chaque Thread du pool «*décompresse*» un fichier et doit écrire dans la ListBox via un délégué par Invoke(). Même punition, plantage au niveau du Invoke().
3) Essai par utilisation d'un seul Thread*:
et là tout se passe correctement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part .... Thread th = new Thread(new ParameterizedThreadStart(this.decompresser)); .....
Info supplémentaire*sur le plantage: aucune exception n'est levée … l'application ne répond pas
Dans les deux premiers essais, si je supprime la ligne Invoke(délégué, texte à ecrire) tout est OK.
Même en mode «*Deboggage*» aucune piste , … délégué bien initialisé …
Grand merci à vous pour votre aide
Partager