Cross-threading

CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010 - 24 sept. 2005 à 14:59
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010 - 26 sept. 2005 à 14:06
Bonjour,



j'ai une application console qui utilise un thread pour écouter des données en provenance d'un socket réseau.

Ce que je voudrais, c'est que lorsque des données sont reçues, que ces données soient traitées par le thread principal.



Je n'ai pas encore trouvé de solution à l'heure actuelle.



Est-ce que qqn a une idée?



Merci d'avance.

13 réponses

cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
24 sept. 2005 à 19:30
Salut,
As-tu jeté un oeil sur le très bon tutorial de MorpionMx ?
Il traite du Cross-Threading justement...
Tu le trouveras à cette adresse : http://www.csharpfr.com/tutorial.aspx?ID=174

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
24 sept. 2005 à 20:20
Merci Bidou

Mx
0
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010
24 sept. 2005 à 20:35
Salut,



oui, j'ai déjà jeter un oeil sur le tutoriel avant de poster. Mais il ne résoud pas mon problème pour autant.

Je n'utilise pas de contrôles dans mon programme (programme Console).



J'ai un thread auxiliaire qui déclenche un évènement et j'aimerais traiter cet évènement dans le thread principal.



Personne n'a d'idée alors?



++
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 sept. 2005 à 20:44
Salut,

.Net 1.1 ou 2.0 ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
0

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

Posez votre question
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010
24 sept. 2005 à 22:53
1.1 pour le moment.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
25 sept. 2005 à 16:36
En fait je commence à me demander si le problème n'est tout simplement pas insoluble :-(

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010
25 sept. 2005 à 17:21
Arf... c'est pas une bonne nouvelle ça!
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
25 sept. 2005 à 17:33
Oui désolé.
Tu peux sans problème mettre en place un callback, mais le code sera toujours executé dans le contexte du thread secondaire, alors que l'utilisation de Control.Invoke permet justement d'executer le code de la méthode de callback dans le contexte du thread ayant déclaré le controle.

Mais il existe peut être une solution que je ne connais pas. (si tu trouves je suis client )

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Paxcal Messages postés 42 Date d'inscription samedi 24 août 2002 Statut Membre Dernière intervention 3 octobre 2005
25 sept. 2005 à 21:37
Bonsoir,

Je viens de trouver cet article qui répond, je pense à la question :

A C# Framework for Interprocess Synchronization and Communication

Il ne parle pas que des process, il traite également des threads.

Pascal
0
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010
25 sept. 2005 à 22:42
Salut,



j'ai rapidement survolé le contenu du lien, mais il ne traite pas de ce que je souhaite arriver à faire.

En effet, ton lien traite surtout des solutions pour prévenir tout
problème lors des accès concurrents (simultanés par plusieurs threads)
à des instances d'objets.



Je pense que le problème reste entier...
0
Paxcal Messages postés 42 Date d'inscription samedi 24 août 2002 Statut Membre Dernière intervention 3 octobre 2005
25 sept. 2005 à 23:19
Relis bien, télécharge le code, fait tourner les exemples tu verras que ça permet de régler ton problème.

J'ai d'ailleurs le même type de programme à développer et ce framework va beaucoup m'aider.

un exemple :

using System;
using System.Diagnostics;
using System.Threading;
using ThreadMessaging;

namespace channel
{

class Program
{
static void Main(string[] args)
{
Test test = new Test();
test.Start();
}
}

class Test
{
private IChannel channel1;

public Test()
{
channel1 = new ThreadChannel(32);
}

void Thread1()
{
while (true)
{
string c = Console.ReadLine();
Console.WriteLine("thread[{0}] Envoi : {1}", Thread.CurrentThread.ManagedThreadId, c);
channel1.Send(c);

if (c == "stop")
{
break;
}
}
}

public void Start()
{
Thread t = new Thread(new ThreadStart(Thread1));
t.Start();


while (true)
{
string c = (string)channel1.Receive();
Console.WriteLine("thread[{0}] Reception : {1}", Thread.CurrentThread.ManagedThreadId, c);

if (c == "stop")
{
break;
}
}
}
}
}


Il faut récupérer le source de l'article pour que cela fonctionne.

Pascal
0
cs_Smalo Messages postés 36 Date d'inscription lundi 3 janvier 2005 Statut Membre Dernière intervention 11 décembre 2006
26 sept. 2005 à 13:43
Salut,
Je sais pas si je répète quelqu'un ou si ça ne règle pas ton problème.. mais ça m'a l'air simple, moi je déclarerai un délegate dans ton programme principal qui fait le traitement des données que tu lui envoi en paramêtre et tu lance ce délégate dans ton thread qui écoute.. du coup les traitements vont se faire dans le délegate par le thread principal .. nan? Si tu veux un bou de code je ferai ça à la maison mais là je suis au taff et pas le tps :(

A+,
Seb.
0
CMatt Messages postés 38 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 15 octobre 2010
26 sept. 2005 à 14:06
Salut,



en fait, mon programme console ne le restera pas longtemps puisque j'ai l'intention de faire une interface graphique.

Si j'ai posté ce sujet, c'est que je n'ai pas trouvé de moyen simple de
déléguer le traitement d'un flux de données reçu par un thread dans un
aure thread.



Je résume mon projet : j'ai un thread auxiliaire qui guette l'arrivée
de messages sur un socket, il recupère les données et je veux traiter
ces données dans le thread principal.

Pourquoi? Je trouve qu'utiliser la méthode Control.Invoke n'est pas
attrayante. C'est pour cela que je suis à la recherche d'une solution
équivalente pour le faire en amont (au niveau de mon objet qui
encapsule le thread auxiliaire).



Ce que je pense faire en définitive, c'est utiliser la méthode Invoke
du formulaire principal de mon application directement dans le corps du
thread auxiliaire, afin d'appeler une méthode de l'bjet qui encapsule
le thread auxiliaire.



Si y a moyen de ne pas utiliser de contrôles, je suis preneur!



@++ et merci pour le temps que vous m'avez consacré.
0
Rejoignez-nous