Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1429 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Comment faire communiquer des threads ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment faire communiquer des threads ?

n°957549
Bleuarff
pouet
Posté le 20-01-2005 à 15:56:08  profilanswer
 

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.
mood
Publicité
Posté le 20-01-2005 à 15:56:08  profilanswer
 

n°957552
chrisbk
-
Posté le 20-01-2005 à 15:57:10  profilanswer
 

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

n°957557
Bleuarff
pouet
Posté le 20-01-2005 à 16:01:44  profilanswer
 

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.
n°957558
chrisbk
-
Posté le 20-01-2005 à 16:03:49  profilanswer
 

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

n°957560
Bleuarff
pouet
Posté le 20-01-2005 à 16:07:59  profilanswer
 

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


---------------
©2008 Bleuarff Corp.
n°957561
Lam's
Profil: bas.
Posté le 20-01-2005 à 16:08:37  profilanswer
 

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.

n°957693
Bleuarff
pouet
Posté le 20-01-2005 à 17:50:15  profilanswer
 

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.
n°957744
Bleuarff
pouet
Posté le 20-01-2005 à 19:24:04  profilanswer
 

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.
n°957749
Bleuarff
pouet
Posté le 20-01-2005 à 19:42:50  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Comment faire communiquer des threads ?

 

Sujets relatifs
[TortoiseSVN][Subversion]peut ont communiquer en ssh TortoiseSvn->Svnliste chainee dynamique sur plusieurs threads
Threads - 1 autre question sur interface graphique[C] Threads et variables
mes threads font ce qu'il veulent ! [Pas tout à fait resolu][C/UNIX] *Resolu* Les threads
Winsock et Threads (Boost) : Problèmeattente de threads pour rendre la main + swing
[AVIS] PHP ou JSP pour communiquer avec une base de données mySQL?Impossible de communiquer avec mon modem GSM!!
Plus de sujets relatifs à : Comment faire communiquer des threads ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR