IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Classe et thread


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut Classe et thread
    Bonjour,
    j'ai créé une classe qui lors de son instenciation crée un thread lui correspondant. Or j'ai un probleme a la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     error: argument of type 'void* (Trs232::)(void*)' does not match 'void* (*)(void*)'
    Il semble que ce probleme soit lié au faite que la bibliotheque pthread (posix) soit ecrite en C et que les threads posix ne gerent pas le C++ (c'est ce que j'ai lu sur un forum anglophone) Dans ce meme forum, il etait conseillé de déclarer une fonction globale pour appeler le thread.
    Mon probleme: La fonction qui appelle le thread est appelée par le constructeur, donc celle la je peux la mettre en globale avec une declaration d'amitié dans la classe, mais le contenu de mon thread, vu qu'il doit etre particulier a chaque instence de classe, je fais comment?

    mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    int Trs232::init_thread()	///Renvoie O si création du thread ok, 1 si Erreur. 
    {	
     
     
    	int erreur;
    	int tid=1; // ca c'est juste un id que j'ai mis a 1 pour l'instant je vais le faire 
                         //correspondre au nombre d' instencie par la suite
     
    	erreur = pthread_create (&thread_com, NULL, recep_loop, (void*)tid);
     
     
    	return erreur;
    }
    La fonction threadée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    void* Trs232::recep_loop(void *threadid)
    {
    	int		Result;
    	char* 	pChaine;
    	int 	tid;  // inutile pour le moment
    	tid = (int)threadid;
     
    	do
    	{
    		Result=Hard_Rx(pChaine);
    		if (Res > 0)
    		{
     
    			Write_Buffer_Rx(pChaine);
    		}
    	} 
    	while (true);
     
    }
    ben merci pour vos lumieres :o)
    ++ Dom

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Si tu veux une lib qui fasse les threads en C++, il y a Boost.Thread !

    Boost.Thread + Boost.Bind est un ensemble assez puissant !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    Enorme !!! :-)

    Ca c'est bon, je viens de regarder, en plus il est directement telechargeable via apt-get :-)
    donc tout benefs, du coup ca va etre plus "souple"
    et bien merci du conseil et zou au boulot.
    A+
    bon mon probleme sera contourné donc du coup je mets resolu!

  4. #4
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    hello,
    Tu ne peux pas passer à pthread_create() l'adresse d'une fonction membre d'une classe. Il faut sortir ta fonction recep_loop() de la classe ou la rendre "static".

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par jmv Voir le message
    hello,
    Tu ne peux pas passer à pthread_create() l'adresse d'une fonction membre d'une classe. Il faut sortir ta fonction recep_loop() de la classe ou la rendre "static".
    Ou créer une fonction statique qui prends en paramètre un pointeur sur une instance de l'objet thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int Trs232::init_thread()
    {	
      int erreur;
      int tid=1; // ca c'est juste un id que j'ai mis a 1 pour l'instant je vais le faire 
      //correspondre au nombre d' instencie par la suite
     
      erreur = pthread_create (&thread_com, NULL, &Trs232::static_recep_loop, (void*)this);
      return erreur;
    }
    // cette fonction est statique à la classe
    void* Trs232::static_recep_loop(void *param)
    {
      Trs232* thread = (Trs232*)param;
      if (thread) return thread->recep_loop();
      return NULL;
    }
    C'est généralement comme ça qu'on fait (même boost.thread fait comme ça en fait, dès lors qu'il passe par une API native pour créer la thread et lui adjoindre une routine de traitement).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    Bien le bonjour,
    j'ai pu me rendre compte que ca ne marchait pas plus avec boost, il me fait des erreurs de pointurs aussi, du coup merci pour vos réponses! ca me premet de comprendre un peu mieux plutot que d'y aller a "tatons".

    Emmanuel, pouruoi ta fonction statique est elle déclaré comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void* Trs232::static_recep_loop(void *param)
    et pas comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static void* Trs232::static_recep_loop(void *param)
    c'est juste un oubli, ou c'est comme ca et la je ne comprends pas ...
    le compilateur le sait comment?
    merci d'avance!!

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    On ne met pas "static" dans la définition d'une fonction membre statique, seulement dans sa déclaration.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    c'est pas faux....
    merci

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    1- C'est encore moi, donc j'ai pris le temps avant de copier le code betement (meme si bon je ne sais pas comment vous pensez a faire des trucs pareils!!) d'essayer de comprendre, est ce que vous pouvez m'expliquez, pourquoi je ne peux pas appeler un thread directement dans ma classe? j'ai bien compris le mecanisme de la "pirouette" pour contourner ce probleme, mais la raison pour laquelle on fait ca n'est pas claire.

    2- Lorsque je compile, j'ai une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Trs232.cpp:271: error: void value not ignored as it ought to be
    et ca pointe sur l'appel de la fonction threadée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int Trs232::init_thread()
    {	
      int erreur;
      int tid=1; // ca c'est juste un id que j'ai mis a 1 pour l'instant je vais le faire 
      //correspondre au nombre d' instencie par la suite
     
      erreur = pthread_create (&thread_com, NULL, &Trs232::static_recep_loop, (void*)this);
      return erreur;
    }
    // cette fonction est statique à la classe
    void* Trs232::static_recep_loop(void *param)
    {
    	Trs232* thread = (Trs232*)param;
    >>>	if (thread) return thread->recep_loop();  <<<<
      return NULL;
    }
    merci

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    C'est apparemment un warning du au fait que tu fais un return sur l'appel d'une fonction retournant void.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    salut
    Ben non... c'est pas un warning, le compilo bloque dessus et c'est ma seule erreur

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    C'est peut-être une erreur, mais la raison est la même: Tu cherches à "return" quelque chose, mais ce quelque chose, c'est void.

    En C++, il me semble que ce genre de chose ne marche que si la fonction contenant le return possède elle-même le type de retour void.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Dom_the_quaker Voir le message
    salut
    Ben non... c'est pas un warning, le compilo bloque dessus et c'est ma seule erreur
    Vérifie: ta fonction retourne void alors qu'elle devrait retourner void*
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    Je pense que mon probleme n'en est plus un
    merci a Medinoc et Emmanuel,
    Dites moi si je me trompe:
    ma fonction renvoyait void car je renvoyais thread->recep_loop() (en fait une fonction)
    et que recep_loop () etait déclaré
    j'ai donc redeclaré en
    et ca compile.
    mais le fait que ca compile ne veut pas dire que ce que j'ai fait est correct. Est ce que c'est la bonne solution?
    honnetement, je me suis juste dit je renvois une fonction alors qu'il faut un pointeur sur une fonction, donc j'ai declaré la fonction concernée de façon "adequate"
    mais la reflexion a avoir n'est elle pas plus poussée? je sais que tout est lié du fait du thread et qu'il m'est impossible d'appeler la fonction membre dans ce thread, donc on passe, comme vous me l'avez montrer, par differents cast et une fonction static, mais la suite ne serait qu'une simple consequence de cette manip?
    en tous les cas merci, et a bientot
    dom

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    C'est bien la bonne solution.
    Citation Envoyé par Dom_the_quaker Voir le message
    honnetement, je me suis juste dit je renvois une fonction alors qu'il faut un pointeur sur une fonction, donc j'ai declaré la fonction concernée de façon "adequate"
    Tu ne retournes pas une fonction ni un pointeur de fonction, tu retournes un pointeur retourné par une fonction.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 86
    Par défaut
    c'est vrai, ce sont des nuances, mais d' importance capitale pour comprendre le mecanisme. encore merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Passage d'une instance de classe à un thread
    Par jesus144 dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2008, 12h19
  2. heritage de la classe System.Threading.Thread
    Par Minoucha2006 dans le forum C#
    Réponses: 5
    Dernier message: 08/05/2008, 12h59
  3. Destruction de classe et thread en cours
    Par Katian dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 04/05/2008, 09h50
  4. plusieurs instance de classe avec thread
    Par lucky dans le forum MFC
    Réponses: 2
    Dernier message: 14/09/2006, 11h30
  5. [C#] Peut-on étendre la classe system.Thread ?
    Par AiSpirit dans le forum C#
    Réponses: 5
    Dernier message: 10/08/2006, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo