Comment faire communiquer des threads ?

Comment faire communiquer des threads ? - C++ - Programmation

Marsh Posté le 20-01-2005 à 15:56:08    

Je suis en C++ managé sous .net, et j'aimerais faire communiquer 2 threads  entre eux. J'ai trouvé aucune doc pour faire de la gestion d'evenements, zavez pas des infos ?


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 20-01-2005 à 15:56:08   

Reply

Marsh Posté le 20-01-2005 à 15:57:10    

de la gestion d'evenement ? genre le mot clé 'event' ? [:petrus75]
tu veux quoi exactement ?
 
(sinon : System.Threading + msdn)

Reply

Marsh Posté le 20-01-2005 à 16:01:44    

system::threading dans la msdn j'y ai déjà passé quelques heures.
Mon pb: J'ai une application réseau avec un thread client distinct du thread principal. Le thread principal a de temps en temps besoin d'nevoyer des données à un serveur. Comment faire pour qu'il dise au thread client qu'il a qqch pour lui et lui filer les données ? Histoire que je le mette en sleep quand y a rien à envoyer et rien à reçevoir de la part du serveur ?


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 20-01-2005 à 16:03:49    

le thread principale balance le boulot dans une file d'attente. Le thread secondaire regarde si y'a du boulot dans la file. Si y'en a il le fait, et le degage de la file, sinon il se met en attente de boulot. tu dois pouvoir jouer avec des mutex pour faire ca

Reply

Marsh Posté le 20-01-2005 à 16:07:59    

avec la file d'attente comme donnée membre d'une classe qui englobe le thread ? pas bete ça !


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 20-01-2005 à 16:08:37    

ReaderWriterLock is used to synchronize access to a resource. At any given time, it allows either concurrent read access for multiple threads, or write access for a single thread.

Reply

Marsh Posté le 20-01-2005 à 17:50:15    

J'ai réussi à avoir une donnée membre de ma classe client à laquelle je peux acceder depuis les 2 threads. Pour ça, je crée ma classe client avant  de lancer le thread.

Code :
  1. void CThread::start()
  2. {
  3. CClient *client = new CClient;
  4. Thread *threadClient = new Thread(new ThreadStart(NULL, client->threadProc));
  5. threadClient->Start();//lancement du thread;
  6. }


 
Le souci, c'est que ma classe client dérive de TcpClient. Et je peux pas me servir de ses méthodes car threadProc (la fonction appelée au lancement du thread) est static et ne peut appeler que du static.

Code :
  1. void CClient::threadProc()
  2. {//fonction appelée a la creation du thread
  3. Console::WriteLine("je suis le second thread, bonjour" );
  4. client->gestionClient();//la il dit qu'il connait pas client, normal
  5. Connect("127", 15000);//illegal call of a non-static member function
  6. }


Donc soit j'ai une variable pour communiquer entre threads, soit j'utilise les méthodes de TcpClient. Comment combiner les 2 ?
J'ai pensé à faire une classe clientHandler qui contiendrait les données à partager et dont hériterait CClient, mais elle hérite déjà de TcpClient et c'est pas possible qu'une  classe __gc hérite de plus d'une classe __gc ou d'une classe non __gc. Je suis coincé :cry: .


Message édité par Bleuarff le 20-01-2005 à 19:25:26

---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 20-01-2005 à 19:24:04    

Est-ce qu'il est possible de lancer le thread en indiquant une fonction non static dans ThreadStart ?
 
Pour le code plus haut, si je déclare ThreadProc en non static, j'ai droit à ce message:
z:\slp12\Reseau\CThread.cpp(26): error C3351: 'System::Threading::ThreadStart' : si vous passez une instance d'objet NULL à un constructeur délégué, vous devez aussi passer l'adresse d'une fonction membre static

Ce qui semble dire que c'est possible, en ne passant pas un pointeur NULL. Mais je dois passer quel pointeur alors ?


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 20-01-2005 à 19:42:50    

Il semblerait qu'en remplaçant

Code :
  1. Thread *threadClient = new Thread(new ThreadStart(NULL, client->threadProc));


par

Code :
  1. Thread *threadClient = new Thread(new ThreadStart(client, &CClient::threadProc));


 
ça marche (ça compile quoi), mais j'arrive pas a lancer le programme, j'ai droit à une System.Security.Policy.PolicyException  (c'est quoi ce truc ?) sur les ordis de l'école, vais etre obligé de rentrer chez moi pour tester.


Message édité par Bleuarff le 20-01-2005 à 19:43:45

---------------
©2008 Bleuarff Corp.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed