cs_zobio
Messages postés18Date d'inscriptionmercredi 12 novembre 2003StatutMembreDernière intervention25 janvier 2005
-
17 janv. 2005 à 13:34
cs_zobio
Messages postés18Date d'inscriptionmercredi 12 novembre 2003StatutMembreDernière intervention25 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.
A voir également:
Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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);
cs_zobio
Messages postés18Date d'inscriptionmercredi 12 novembre 2003StatutMembreDernière intervention25 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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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 )
cs_zobio
Messages postés18Date d'inscriptionmercredi 12 novembre 2003StatutMembreDernière intervention25 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...)
cs_RMI
Messages postés304Date d'inscriptionvendredi 18 juillet 2003StatutMembreDernière intervention 2 août 20102 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é.)
cs_zobio
Messages postés18Date d'inscriptionmercredi 12 novembre 2003StatutMembreDernière intervention25 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...
cs_RMI
Messages postés304Date d'inscriptionvendredi 18 juillet 2003StatutMembreDernière intervention 2 août 20102 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)