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 :

Creation d'une tache dans un objet


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut Creation d'une tache dans un objet
    Bonjour,

    Je souhaite cree une tache associée à un objet (C++/GCC).

    J'ai essayé de faire un appel de pthread_create dans une methode de classe particuliere du style :

    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
    /*
     * Tache de tracking des vehicules
     */
    void CRadar::Tracking()
    {
    }
     
    /*
     * Demarrage de la tache de tracking
     */
    int CRadar::StartTracking(void)
    {
    // Creation de la tache de tracking
    if(pthread_create(&this->IDTacheTracking, NULL, (void*)this->Tracking,NULL) != 0)
    	{
    	cout << "CRadar.cpp : Echec de creation de la tache de tracking du Radar n°" << (unsigned int)this->ID << endl;
    	return(-1);
    	}
     
    return 0;
    }
    Mais je me retrouve avec des erreurs de compilation du style :
    ../CRadar.cpp: In member function ‘int CRadar::StartTracking()’:
    ../CRadar.cpp:53: error: invalid use of member (did you forget the ‘&’ ?)
    Quelqu'un aurait il une solution a cette problematique ?

    Merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut Toujours en erreur de compil sous Gcc
    Je reste toujours en erreur de compil, je ne comprends pas pourquoi !!!

    .h :
    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
    class CRadar
    	{
    	public:
    		// Methodes publiques
    		CRadar(unsigned char,float,float,const char *);
    		virtual ~CRadar();
    		void* Tracking(void* );
    		int StartTracking(void);
     
    	private:
    		// Membres prives
    		unsigned char ID;
    		float Hauteur;
    		float Angle;
    		CPort Port;
    		pthread_t *IDTacheTracking;
    	};
    .cpp:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <iostream>
    #include <pthread.h>
    #include "CRadar.h"
    using namespace std;
     
    /*
     * Creation du radar
     */
    CRadar::CRadar(unsigned char ident,float hauteur,float angle,const char *NomPortSerie)
    {
    int Ret;
     
    // Affectation des donnees d'initialisation
    this->ID = ident;
    this->Hauteur = hauteur;
    this->Angle = angle;
     
    cout << "CRadar.cpp : Création du Radar n°" << (unsigned int)this->ID << " sur " << NomPortSerie << endl;
     
    // Ouverture du port serie associe
    Ret = Port.Ouverture(NomPortSerie);
    }
     
    /*
     * Destrution de l'objet radar
     */
    CRadar::~CRadar()
    {
    cout << "CRadar.cpp : Destruction du Radar n°" << (unsigned int)this->ID << endl;
     
    // Fermeture du port serie associe
    Port.Fermeture();
    }
     
    /*
     * Tache de tracking des vehicules
     */
    void* CRadar::Tracking(void* arg)
    {
    }
     
    /*
     * Demarrage de la tache de tracking
     */
    int CRadar::StartTracking(void)
    {
    // Creation de la tache de tracking
    pthread_create(IDTacheTracking, NULL, Tracking, NULL);
     
     
    return 0;
    }
    Erreur :

    make all
    Building file: ../CRadar.cpp
    Invoking: GCC C++ Compiler
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"CRadar.d" -MT"CRadar.d" -o"CRadar.o" "../CRadar.cpp"
    ../CRadar.cpp: In member function ‘void* CRadar::Tracking(void*)’:
    ../CRadar.cpp:46: warning: no return statement in function returning non-void
    ../CRadar.cpp: In member function ‘int CRadar::StartTracking()’:
    ../CRadar.cpp:54: error: argument of type ‘void* (CRadar:(void*)’ does not match ‘void* (*)(void*)’
    make: *** [CRadar.o] Erreur 1


    Quel est le souci ???

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Signal40 Voir le message
    Quel est le souci ???
    Vu que rien n'est changé dans le code, le souci est toujours le même :

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,

    Tu ne peux passer qu'une fonction de classe à une interface C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CRadar
    {
    // ...
    static void* Tracking(void* );
    //...
    };
    En général, on utilise le paramètre pour passer une instance de ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int CRadar::StartTracking(void)
    {
    // Creation de la tache de tracking
    pthread_create(IDTacheTracking, NULL, Tracking, this);
     
     
    return 0;
    }
    Puis dans la fonction du thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void* CRadar::Tracking(void* arg)
    {
        CRadar &instance = *reinterpret_cast<CRadar*>(arg);
        instance.do_it();
    }

    ****************************************
    Ta classe thread devrait probablement ne pas être copiable.
    Tu devrais préférer les listes d'initialisations aux initialisations dans le constructeur
    Préfères l'utilisation des std::string aux chaînes à la C
    Les actions faites dans CPort::Ouveture et CPort::Fermeture ne devraient-elles pas être dans le constructeur/destructeur de CPort ? La fonction CPort ressemble furieusement à ce genre de classe (comme un fichier, une socket, etc..) ? Incidemment, CPort devrait alors gérer explicitement sa copie.

    Ce qui pourrait donner :
    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
    #include <string>
    class CPort
    {
    public:
       CPort(std::string arg_)
       {
          Ouverture(arg_);
       }
       ~CPort()
       {
          Fermeture();
       }
    private:
       int Ouverture(std::string){return 0;}
       void Fermeture(){}
     
       CPort(CPort const&); // = delete
       CPort&operator=(CPort const&);// = delete
    };
    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
    22
    23
    24
    25
    26
    #include <pthread.h>
    #include <string>
    class CRadar
    {
    public:
       // Methodes publiques
       CRadar(unsigned char,float,float,std::string const&);
       virtual ~CRadar();
       int StartTracking(void);
     
    private:
       static void* Tracking(void* );
       void do_it(){}
     
       CRadar(CRadar const&);
       CRadar&operator=(CRadar const&);
     
     
    private:
       // Membres prives
       unsigned char ID;
       float Hauteur;
       float Angle;
       CPort Port;
       pthread_t *IDTacheTracking;
    };
    Puis :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <iostream>
    #include "CRadar.h"
    using std::cout;
    using std::endl;
     
    /*
    * Creation du radar
    */
    CRadar::CRadar(unsigned char ident,float hauteur,float angle,std::string const &NomPortSerie)
    :ID(ident),Hauteur(hauteur),Angle(angle),Port(NomPortSerie),IDTacheTracking(0)
    {
       cout << "CRadar.cpp : Création du Radar n°" << (unsigned int)this->ID << " sur " << NomPortSerie << endl;
    }
     
    /*
    * Destrution de l'objet radar
    */
    CRadar::~CRadar()
    {
       cout << "CRadar.cpp : Destruction du Radar n°" << (unsigned int)this->ID << endl;
    }
     
    /*
    * Tache de tracking des vehicules
    */
    void* CRadar::Tracking(void* arg)
    {
       CRadar &instance = *reinterpret_cast<CRadar*>(arg);
       instance.do_it();
    }
     
    /*
    * Demarrage de la tache de tracking
    */
    int CRadar::StartTracking(void)
    {
       // Creation de la tache de tracking
       pthread_create(IDTacheTracking, NULL, Tracking, this);
     
     
       return 0;
    }
    D'un point de vue architecture, CRadar semble avoir plusieurs responsabilités : gestion du thread, gestion d'échange (via le port COM) et gestion du radar (entité). Probablement cela relève de plusieurs classes sans quoi CRadar va rapidement enflée et être constamment en évolution.

  6. #6
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Argh... j'ai buté un moment sur cette 'tache' qui était en fait une 'tâche' !!!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut Essais à faire
    Je vais essayer, merci pour l'info... à suivre ...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut Plantage
    J'ai essayé la solution proposée.

    Cela passe à la compilation et au link (pthread a bien été inclu).

    Mais à l'appli se bloque à l'éxécution (debugger eclipse cdt).
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include "CPort.h"
     
    #ifndef CRADAR_H_
    #define CRADAR_H_
     
    class CRadar
    	{
    	public:
    	   // Methodes publiques
    	   CRadar(std::string &,unsigned char &,float &,float &);
    	   ~CRadar();
    	   int StartTracking(void);
     
    	private:
    	   static void* Tracking(void* );
    	   void do_it(){};
     
    	private:
    	   // Membres prives
    	   unsigned char ID;
    	   float Hauteur;
    	   float Angle;
    	   CPort Port;
    	   pthread_t *IDTacheTracking;
    	};
     
    #endif /* CRADAR_H_ */
     
    #include <iostream>
    #include <pthread.h>
    #include "CRadar.h"
     
    using std::cout;
    using std::endl;
     
    /*
    * Creation du radar
    */
    CRadar::CRadar(std::string &nomPort,unsigned char &ident,float &hauteur,float &angle)
    :ID(ident),Hauteur(hauteur),Angle(angle),Port(nomPort)
    {
    cout << "CRadar.cpp : Création du Radar n°" << (unsigned int)this->ID << " sur " << nomPort << endl;
    }
     
    /*
    * Destrution de l'objet radar
    */
    CRadar::~CRadar()
    {
    cout << "CRadar.cpp : Destruction du Radar n°" << (unsigned int)this->ID << endl;
    }
     
    /*
    * Tache de tracking des vehicules
    */
    void* CRadar::Tracking(void* arg)
    {
    CRadar &instance = *reinterpret_cast<CRadar*>(arg);
    instance.do_it();
    }
     
    /*
    * Demarrage de la tache de tracking
    */
    int CRadar::StartTracking(void)
    {
    // Creation de la tache de tracking
    pthread_create(IDTacheTracking,NULL,Tracking,this);
     
     return 0;
    }
    Instanciation de l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CRadar MonRadar(a,b,c,d);
    MonRadar.StartTracking();
    Message eclipse :

    Thread [1] 6649 (Suspended : Signal)
    pthread_create@@GLIBC_2.1() at 0x135454
    CRadar::StartTracking() at /home/ddulau/workspace/EMB110004/EMB110004D/CRadar.cpp:46
    main() at /home/ddulau/workspace/EMB110004/EMB110004D/EMB110004.cpp:30

    et ouverture de fenetre :
    .settings does not exist.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Ajouter breakpoint et debugger à la main ?

    A tout hasard, ton thread principal ne se termine pas juste après ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CRadar::~CRadar(void)
    {
    // Wait end of thread ???
    pthread_join(IDTacheTracking,NULL,);
    }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut
    L'objet est instancié dans le main puis le main passe en attente par un while(1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string a(COM_USB0);
    unsigned char b=0;
    float c=1,d=3;
     
    CRadar MonRadar(a,b,c,d);
    MonRadar.StartTracking();
    while(1)
        {
        usleep(1000000);
        cout << "princ"  << endl;
        }
    c'est tout ce que le programme.

    En débug pas à pas l'appli plante juste sur l'exécution de la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pthread_create(IDTacheTracking,NULL,Tracking,this);
    Question : Pourquoi la référence à la méthode Tracking s'affiche en italique dans l'IDE eclipse ? Je ne l'ai jamais vu ailleurs et peut être en relation avec le problème.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Je n'avais pas fait attention, mais :
    pthread_t IDTacheTracking;, et
    pthread_create(&IDTacheTracking,NULL,Tracking,this);

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Par défaut Merci 3DArchi
    Problème résolu

    La tache se lance et tourne

  13. #13
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Tu veux sans doute parler de la 'tâche' ? ('tache' et 'tâche' deux mots complètement différents)

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Tu veux sans doute parler de la 'tâche' ? ('tache' et 'tâche' deux mots complètement différents)
    "Optimiser l'orthographe avant d'avoir constaté un problème de perf" is evil
    les taches se traitant avec Ariel, dans un problème informatique qui plus est posté dans un forum intitulé "Threads & Process" on peut supposer avec moins de 0.00001% de risque d'erreur qu'une tache est en réalité une tâche...et alors on optimise la ratio signal bruit en lâchant l'affaire, man!

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

Discussions similaires

  1. Creation d'une icon dans la barre des taches
    Par Janitrix dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 22/12/2005, 22h36
  2. Réponses: 2
    Dernier message: 02/08/2004, 17h34
  3. [JSP] Ajout d'une tache dans le planificateur Windows
    Par PhoneKilleR dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 12/09/2003, 15h10
  4. creation d'une raccourcie dans le menu demarre
    Par kenshi dans le forum MFC
    Réponses: 14
    Dernier message: 11/09/2003, 14h59
  5. Creation d une clee dans la registry en VC++
    Par rico27fr dans le forum MFC
    Réponses: 4
    Dernier message: 30/05/2002, 12h36

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