Thread Events Invoke --> Je rends les armes ....

ylerazer Messages postés 7 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 2 janvier 2007 - 29 nov. 2005 à 15:09
ylerazer Messages postés 7 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 2 janvier 2007 - 4 déc. 2005 à 08:31
Bonjour,
je suis nouveau en C# et j'essaie de me faire des classes intelligentes .. mais j'ai bien peur qu'elles ne soient plus intelligentes que moi. Voici mon problème : ( j'ai enlevé les properties ... pour etre le plus synthétique possible )

au passage RV est une techno TIBCO qui permet de faire du temps réel ... ( c'est comme si on faisait de l'udp mais avec la notion de sujet auquel on souscrit ... )

public class RVConsumer :
{
private Thread t;
private System.Collections.Queue myQueue;

private bool isListenning = false;
private string network;
private string service;
private string daemon;
private string subject;

// Constructor
public RVConsumer(string mService, string mNetwork, string mDaemon, string mSubject)
{
Network = mNetwork;
Daemon = mDaemon;
Service = mService;
Subject = mSubject;
}


//Realtime status
public void start()
{
isListenning = true;
t = new Thread(new ThreadStart(listen));
t.Name = this.ToString();
// listen();
}
public void restart()
{
stop();
isListenning = true;
t = new Thread(new ThreadStart(listen));
}
public void stop()
{
isListenning = false;
t.Abort();
}



// Reception Message and event
private void listen()
{
try
{
TIBCO.Rendezvous.Environment.Open();
Transport transport = null;
transport = new NetTransport(Service,Network,Daemon);
Listener listener = new Listener(Queue.Default,transport,Subject,null);
listener.MessageReceived += new MessageReceivedEventHandler(OnMessageReceived); // --> ici je place ma fonction dans la pile d'execution sur reception d'un message ...
while (isListenning)
{
Queue.Default.Dispatch();
}
TIBCO.Rendezvous.Environment.Close();
}
catch (RendezvousException exception)
{
System.Diagnostics.Debug.WriteLine("Exception while listenning :");
System.Diagnostics.Debug.WriteLine(exception.Message);
}
}




void OnMessageReceived(object listener,MessageReceivedEventArgs messageReceivedEventArgs)
{
Message message = messageReceivedEventArgs.Message; if (myQueue null) {myQueue new System.Collections.Queue();}
myQueue.enqueue(message); // --> et la c'est le drame ... je n'arrive pas a empiler ...
}

}
}

Pouvez vous m'aider ? et d'ou sort le Invoke que je lis partout ... sachant que la classe qui va gérer celle ci n'est pas un formulaire ???

d'avance merci

5 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
29 nov. 2005 à 15:42
ylerazer Messages postés 7 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 2 janvier 2007
29 nov. 2005 à 16:00
Je l'ai lu ... et voila mon problème ....

-- Ensuite, créons le délégué correspondant
-- private delegate void ChangeLabel(stringstr);
-- L’utilisation de la méthode Invoke s’effectue ainsi, dans la méthode ThreadMethod
-- this.Invoke(newChangeLabel(ChangeLabelText), "Label après opération");

--> la classe qui gère la queue est la meme et n'a pas de méthode invoke car ce n'est pas un formulaire et c'est la que je suis perdu ...
( au passage merci pour ta réactivité ... )
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
29 nov. 2005 à 17:00
j'ai regardé un peu, le probleme, c'est qu'on peut pas specialement tester ton code.
Donc j'ai fait une mini classe toute bete qui lance un thread et qui ajoute une string dans une Queue (et pas de mauvaise interpretation s'il vous plait )
Meme si c'est pas tres beau, j'ai fais le Queue.Add() dans le thread, et ca a parfaitement fonctionné.
Donc la petite question prealable, je ne vois aucun appel a Start(), ni a t.Start() dans ton code. Est-ce normal ?

Mx
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 déc. 2005 à 09:22
Pas de nouvelles ?

Bon autrement, voila comment procéder.


<HR>
public void delegate addMessageDelegate;
public void AddMessage(Message message)
{
myQueue.enqueue(message);
}

//Et dans la méthode du Thread :
AddMessageDelegate amd = new AddMessageDelegate(AddMessage);
amd.invoke(message);

<HR>

Mx

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

Posez votre question
ylerazer Messages postés 7 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 2 janvier 2007
4 déc. 2005 à 08:31
Bonjour,
excuse moi pour le manque de réactivité ... mais j'ai été pris par mon boulot et du coup je ne m'y suis remis que le vendredi après midi...
en fais, j'ai continuer a lire et je me dirige tout droit vers l'utilisation d'un pool de thread. Et j'irai l'interroger toutes les 250 ms pour pouvoir ensuite passer ou non un evenement a mon thread principal....

Je vais tout de meme essayer ton aide voir si j'y arrive.

Milles merci. je te tiens au courant ... ( j'ai re acces au code lundi)
Rejoignez-nous