Exécution sous Thread spécifique

thegitch Messages postés 2 Date d'inscription mardi 2 octobre 2007 Statut Membre Dernière intervention 23 avril 2009 - 23 avril 2009 à 10:21
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Derniè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 ?

Merci d'avance pour vos réponses,

Ritchouone

4 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
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 -
0
thegitch Messages postés 2 Date d'inscription mardi 2 octobre 2007 Statut Membre Dernière intervention 23 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 ! :-)

Toute bonne journée,

Gitch
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
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 -
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 avril 2009 à 14:30
Bonjour,

STAThread ne prend normalement son sens qu'au moment où le code entre dans le monde COM, côté managé la notion d'appartment n'a pas court.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous