Bonjour à tous,
Difficile d'ennoncer une question claire vis à vis de mon probleme... c'est plutot compliqué.
Voilà ce qui me pose tant probleme :
Dans mon soft, j'ai une classe dont une méthode créé un thread pour lancer un process (commande dos) qui génere un traitement long (encodage).
Une fois cet encodage terminé, la classe doit envoyer un evenement disant qu'il est terminé.
Jusque là, mes evenements ont toujours fonctionné mais avec l'utilisation d'un thread ça se complique.
Donc voila grosso modo comment ca se passe :
J'ai une méthode void Toutencoder() qui lance mes threads (ça gere une liste d'attente donc les lance un par un).
Dans cette methode, on lance un nouveau thread faisant appel à la méthode LancerCommande. Dans lancerCommande() j'ai les opérations devant se faire donc en parallele (contenues dans le thread). Dans cette méthode, j'execute ce que je dois faire, puis je fais appel à un delegate pour lancer mon évenement une fois que mon process est terminé (en fait dans LancerCommande, je lance mon process, je fais un waitForExit pour attendre la fin de l'encodage puis j'invoke la methode lançant l'evenement).
Cette methode que j'invoke pour lancer l'evenement est toute bete, des plus classiques, si mon evenement!=null alors tu m'en créé un nouveau et tu l'envoies.
Sauf que maintenant, quand je met ce que doit faire mon programme lors de la reception de cet evenement, il me dit que ça n'a pas été lancé par le meme thread que celui qui gere -notamment- la progressbar que je souhaite modifier.
J'ai donc l'impression que tout ce qui suit l'evenement est toujours contenu dans mon thread créé. Je ne sais pas vraiment comment ca se passe...
Voici un petit bout de code pour vous expliquer un peu mieux :
Si quelqu'un a une idée, je suis preneur !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 MethodeEncoder() { ... thread tr = new Thread(this.lancerEncodage); tr.start(); ... } LancerEncodage() { process myproc = new process(); ... myproc.start(); myproc.waitForExit(); FinEncodageDelegate FE = new FinEncodageDelegate(FinEncodage); FE.Invoke(); } FinEncodage() { if(EncodeEnded!=null) EncodeEnded(this,EncodeEndedEventArgs()); } Et dans mon code au niveau de l'ihm : void MaClasse_EncodeEnded(object sender, EncodeEndedEventArgs e) { progressbar1.value = 20; }
Merci d'avance
@ ++
Partager