thegitch
Messages postés2Date d'inscriptionmardi 2 octobre 2007StatutMembreDernière intervention23 avril 2009
-
23 avril 2009 à 10:21
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
26 avril 2009 à 14:30
Bonjour à tous,
Comment, depuis un thread B, exécuter une méthode sous un thread A ? Je m'explique.
Le thread A est le thread principal, le main, le thread de base. Le thread B a été créé pour effectuer une tâche assez longue, en arrière plan et bien sûr pour éviter de bloquer le thread A. Une fois que le thread B a terminé son travail, j'aimerais que le thread B donne l'ordre au thread A d'exécuter une méthode quelconque, mais que cette méthode soit effectivement exécutée par le thread A et non par le B.
Pourquoi ? La raison est que le thread A utilise une librairie XY qui n'accepte des instructions QUE du thread principal, donc le A. Si B appelle une méthode de cette librairie, l'instruction est refusée et génère une exception.
En Windows Forms, il existe le magnifique BackgroundWorker qui fonctionne à merveille, sauf que mon application est en Console et doit le rester. Quelles sont les possibilités ?
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 23 avril 2009 à 16:33
Salut.
Une solution simple que je vois (pas testée) est d'utiliser un événement auquel s'abonnera ton thread principal, et de lever cet événement dans ton autre thread.
Tu peux regarder par là. Je ne promets rien, mais je pense que ça devrait marcher pour ton problème.
Krimog : while (!(succeed = try())) ;
- Quand le règlement tu respecteras, ravis de te répondre on sera -
thegitch
Messages postés2Date d'inscriptionmardi 2 octobre 2007StatutMembreDernière intervention23 avril 2009 23 avril 2009 à 17:59
Merci pour ta réponse, je vois que tu as très bien cerné le sujet :-) mais malheureusement (et là j'ai testé), le problème n'est pas réglé.
En effet, les threads créés génèrent bien un événement qui lance une méthode, mais ce sont bel et bien les threads auxiliaires qui exécutent cette méthode, et non le thread principal.
Tu peux constater qu'un commentaire a été posté exactement sur ça, par COQ. J'ai envoyé un mp au concepteur de l'article et je verrai bien si j'aurai une réponse.
Merci encore beaucoup pour ton aide parce qu'elle m'ouvre une nouvelle voix avec les événements et peut-être même les exceptions ! :-)
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 23 avril 2009 à 19:13
L'autre méthode que je vois (mais ce n'est clairement pas propre), c'est de faire une boucle dans ton thread principal qui vérifie la valeur d'une variable modifiée par ton thread :
Dans ton thread A : while (!sortir) System.Threading.Thread.Sleep(100);
et à la fin de ton thread B : sortir = true;
Bien sûr, c'est bloquant en ce qui concerne ton thread principal.
Et sinon, je ne connais pas bien l'effet de l'attribut [STAThread] mais je crois que ça a aussi à voir avec les thread principaux. Tu peux regarder par là.
Enfin, tu peux également te renseigner sur Dispatcher.BeginInvoke
Krimog : while (!(succeed = try())) ;
- Quand le règlement tu respecteras, ravis de te répondre on sera -