Problème de thread et event

Résolu
cs_zobio Messages postés 18 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 25 janvier 2005 - 17 janv. 2005 à 13:34
cs_zobio Messages postés 18 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 25 janvier 2005 - 17 janv. 2005 à 17:36
Voila, je cherche a lancer un thread secondaire à partir de mon thread principal, jusque la pas de soucis. Ensuite je voudrais que lorsque mon thread secondaire se termine, le thread principal lance une fonction qui lui est propre. Ca semble être relativement basique puisque le principe est de sous traiter une partie de traitement et d'être avisé lorsque le taf est terminé.
Pourtant je ne vois pas trop comment faire.
J'ai essayé avec un event mais le principe de l'event delagate fait que le c'est le thread secondaire qui effectue lance la fonction ratachée a l'event donc ca ne marche pas...

Si ce n'est pas assez clair je peux mettre un bout de code ...

Merci d'avance.

15 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
17 janv. 2005 à 17:00
Effectivement la méthode est exécutée dans le contexte du thread qui déclenche son appel...
J'ai bien une idée mais je me demande si elle est vraiment correcte...l'idée est d'utiliser Control.Invoke.

Appliqué à l'exemple ça donnerai :
object[] args = new object[]{i, Thread.CurrentThread.Name};
Control ctrl = (Control)CallBackMethod.Target;
ctrl.Invoke(CallBackMethod, args);


au lieu de
//Tell the main thread we have completed
CallBackMethod(i,Thread.CurrentThread.Name);

Cocoricoooooooo !!!!
coq
MVP Visual C#
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
17 janv. 2005 à 13:52
Si j'ai bien compris ta question, cette page te donne une solution :
Calling Your Main Thread from a Worker Thread in C#
:-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 janv. 2005 à 14:35
en fait tu fais un thread.Start() et tu voudrais faire kkchose quand le thread a fini...

donc apres ton thread.start()
tu fais thread.join(); l'appli se met en attente de fin du thread
et apres tu fais ton script...


Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
0
cs_zobio Messages postés 18 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 25 janvier 2005
17 janv. 2005 à 14:57
Merci de vos réponses, voila mes commentaires :

Pour Coq :
Cette méthode est celle que j'avais utilisée au début, seulement ca ne peut pas fonctionner si ca ton fonction callback touche aux controles de ton formview. Si tu demandes a afficher un message ca marche nickel, si tu veux modifier le titre d'un bouton par exemple, ca plante message :

An unhandled exception of type 'System.InvalidOperationException' occurred in system.windows.forms.dll


Additional information: The action being performed on this control is being called from the wrong thread. You must marshal to the correct thread using Control.Invoke or Control.BeginInvoke to perform this action.

Pour Arthenius :

J'ai aussi essayé cette méthode mais ce n'est pas vraiment interressant.
Pour moi le multithreading sert a permettre a l'utilisateur de pouvoir faire plusieurs choses en même temps, avec le Join l'appli est bloquée et le thread secondaire fait son taf, mais l'utilisateur est obligé d'attendre la fin pour reprendre la main... a moins que quelque chose ne m'ais echapé..

Pour le moment la seule solution acceptable que j'ai trouvé est de lancé un timer après le start du thread secondaire. je teste ensuite la propriété IsAlive du thread secondaire et quand elle passe a false je fais mon traitement. Je ne trouve pas ca terrible...

Si ca vous avez d'autres idées ca m'interresse, je pense que tout ceux qui voudront un jour ou l'autre faire du threading seront confrontés a ce genre de galère...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
17 janv. 2005 à 14:59
Pas bete la méthode du Thread.Join();

Mais s'il a besoin d'utiliser son appli pendant l'execution du 2eme
thread, il pourra pas, si ? (vu que le Thread.Join() va attendre la fin
de son execution )
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
17 janv. 2005 à 15:02
Suis a la bourre moi :D
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
17 janv. 2005 à 15:10
.Net 1.1 ou 2.0 ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
cs_zobio Messages postés 18 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 25 janvier 2005
17 janv. 2005 à 15:18
Bein je suis en visual studio 2003 donc il me semble que c'est le framework 1.1
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 janv. 2005 à 15:48
Mx d'habitutde c coq kest a la bourre comme ca :o)))

juste un conseil installe le sp1 du framework 1.1 pour eviter les surprises... avec les threads...
sinon oui c vrai le join bloque l'appli....
:o(((

et pkoi pas faire un autre thread qui ferais un
while(monThread.Isaalive)
{
Thread.sleep(1000);
}
//Lance ma routine...

note c pas tres difféernet du timer...


Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
0
cs_zobio Messages postés 18 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 25 janvier 2005
17 janv. 2005 à 16:16
Le service pack est installé.
Par contre la j'ai un truc de ouf... je dois être neuneu...
Petit rappel :
Je crée un thread dans une fonction de mon FormView Principal.
Le but est de faire une recherche de fichiers avec ce thread et de mettre a jour le formview principal une fois le thread secondaire terminé.
Je lance un timer qui teste IsAlive du thread secondaire. (ca marche)
Quand il est fini je lance une fonction de mon Formview et la j'ai encore une erreur, il me dit que le thread qui essaye de modifier le controle n'est pas le bon...
Comment est ce possible sachant que je n'ai que deux threads et que le secondaire est mort. ???
Y a t'il un truc a faire pour dire quel est le thread actif (ce qui me semble abérent mais bon...)
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
17 janv. 2005 à 16:43
Je suis peut être à la ramasse avec ma méthode, j'utilise aussi des thread qui tourne en tache de fond sans bloquer le programe (avec un Application.DoEvents de temps en temps)
ces threads génère des evenements qui sont interceptés par le prog principal. (exp evt : Le thread a trouvé telle valeur, le thread s'est arrété.)

Théo
0
cs_zobio Messages postés 18 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 25 janvier 2005
17 janv. 2005 à 16:52
Ok mais quand tu es dans ta fonction qui intercepte l'evenement as tu essayé de modifier un controle de ton appli ? (controle crée par le thread principal).
Si je me contente de faire apparaitre un message ca fonctionne sans probleme, les soucis commencent quand je veux modifier un controle de mon formview...
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
17 janv. 2005 à 17:04
jette un oeuil la dessus :
http://www.csharpfr.com/forum.v2.aspx?ID=365325

Arthenius

"Il n'y a pas de mauvais développeurs,...
mais uniquement de mauvais utilisateurs..."
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
17 janv. 2005 à 17:26
La fonction qui récupère l'evenement n'a aucun pb pour modifier l'état des controle. Je me sert de cette méthode pour gérer une animation. J'ai 2 evt :
un qui me dis ou j'en suis dans l'avencement de l'animation (la fonction qui récupère l'evt gére une jauge d'avancement)
un autre qui me dit quand l'animation est terminée (la fonction qui récupère l'evt change l'état de mes btn)

Théo
0
cs_zobio Messages postés 18 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 25 janvier 2005
17 janv. 2005 à 17:36
Effectivement coq, avec le invoke sur le controle ca marche impec...

Merci a tous !
0
Rejoignez-nous