Problème de thread et event [Résolu]

Messages postés
18
Date d'inscription
mercredi 12 novembre 2003
Dernière intervention
25 janvier 2005
- 17 janv. 2005 à 13:34 - Dernière réponse :
Messages postés
18
Date d'inscription
mercredi 12 novembre 2003
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.
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 17 janv. 2005 à 17:00
3
Merci
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#

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 17 janv. 2005 à 13:52
0
Merci
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#
Commenter la réponse de cs_coq
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Dernière intervention
6 septembre 2011
- 17 janv. 2005 à 14:35
0
Merci
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..."
Commenter la réponse de Arthenius
Messages postés
18
Date d'inscription
mercredi 12 novembre 2003
Dernière intervention
25 janvier 2005
- 17 janv. 2005 à 14:57
0
Merci
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...
Commenter la réponse de cs_zobio
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 17 janv. 2005 à 14:59
0
Merci
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 )
Commenter la réponse de MorpionMx
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
- 17 janv. 2005 à 15:02
0
Merci
Suis a la bourre moi :D
Commenter la réponse de MorpionMx
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 17 janv. 2005 à 15:10
0
Merci
.Net 1.1 ou 2.0 ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
18
Date d'inscription
mercredi 12 novembre 2003
Dernière intervention
25 janvier 2005
- 17 janv. 2005 à 15:18
0
Merci
Bein je suis en visual studio 2003 donc il me semble que c'est le framework 1.1
Commenter la réponse de cs_zobio
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Dernière intervention
6 septembre 2011
- 17 janv. 2005 à 15:48
0
Merci
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..."
Commenter la réponse de Arthenius
Messages postés
18
Date d'inscription
mercredi 12 novembre 2003
Dernière intervention
25 janvier 2005
- 17 janv. 2005 à 16:16
0
Merci
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...)
Commenter la réponse de cs_zobio
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Dernière intervention
2 août 2010
- 17 janv. 2005 à 16:43
0
Merci
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
Commenter la réponse de cs_RMI
Messages postés
18
Date d'inscription
mercredi 12 novembre 2003
Dernière intervention
25 janvier 2005
- 17 janv. 2005 à 16:52
0
Merci
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...
Commenter la réponse de cs_zobio
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Dernière intervention
6 septembre 2011
- 17 janv. 2005 à 17:04
0
Merci
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..."
Commenter la réponse de Arthenius
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Dernière intervention
2 août 2010
- 17 janv. 2005 à 17:26
0
Merci
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
Commenter la réponse de cs_RMI
Messages postés
18
Date d'inscription
mercredi 12 novembre 2003
Dernière intervention
25 janvier 2005
- 17 janv. 2005 à 17:36
0
Merci
Effectivement coq, avec le invoke sur le controle ca marche impec...

Merci a tous !
Commenter la réponse de cs_zobio

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.