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

C++ Discussion :

Pointeur sur une fonction membre dans une autre fonction membre


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut Pointeur sur une fonction membre dans une autre fonction membre
    Bonjour à tous,

    Je rencontre un petit problème.
    J'ai une class THREAD qui sert tout simplement à encapsuler le système de thread de l'API Win32.
    Dans cette classe j'ai une fonction DWORD WINAPI lancer_thread(LPVOID), cette fonction est appelée lors de la création du thread (3ème argument de CreateThread()).
    Cette fonction appelle en réalité une autre fonction pointée par un membre de la classe THREAD.
    C'est simplement pour l'encapsulation, ça me permet d'utiliser des types standards pour créer ma fonction-thread() dans mon code. Au lieu de faire une fonction DWORD WINAPI fonction(LPVOID), je fait une void fonction(void*).
    Mais voilà, lorsque ma classe appelle CreateThread, elle a besoin d'un pointeur sur lancer_thread (3ème argument de CreateThread()), et si j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateThread(NULL,0,&this->lancer_thread, parametres, CREATE_SUSPENDED, &this->id_thread);
    Mon compilateur (GCC) Me renvoie gentiment l'erreur suivante :

    ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say '&GM::THREAD::lancer_thread'
    Je veux bien moi mais je ne peux pas mettre ma fonction en static!!

    Comment faire?!?

    Merci d'avance de vos réponses.

    Spartan03
    Pourquoi faire simple quand on peut faire compliqué!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Moi, pour ce genre de choses, j'utilise une fonction static comme wrapper:
    Code header : 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
     
    struct st_threadParams
    {
    THREAD obj;
    LPVOID parametres;
    //etc.
    };
     
    class THREAD:
    {
    public:
    	HANDLE LancerThread(LPVOID params, UINT *pId);
    private:
    	static UINT WINAPI SThreadProc(LPVOID);
     
    //Je suppose que ta classe se définit par héritage...
    protected:
    	virtual DWORD VThreadProc(LPVOID);
    };
    Code source : 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
     
    HANDLE THREAD::LancerThread(LPVOID parametres, UINT *pId);
    {
    //Création d'une structure : 
    //Allocation dynamique ou attente de confirmation du thread.
    //Dans cet exemple, allocation dynamique
    st_threadParams *pParams = new st_threadParams;
    pParams->pObj = this;
    pParams->parametres = parametres;
     
    //NOTE: Utiliser de préférence _beginthreadex() dans process.h
    //Car on utilise la C Run-Time Library...
    //return CreateThread(NULL, 0, SThreadProc, pParams, 0, NULL);
    return reinterpret_cast< HANDLE >(
     _beginthreadex(NULL, 0, SThreadProc, pParams, 0, pId)
     );
    }
     
    UINT WINAPI THREAD::SThreadProc(LPVOID pvParams)
    {
    st_threadParams * pParams = static_cast<st_threadParams*>(pvParams);
    //Lecture de la structure de paramètres
    THREAD *pObj = pParams->pObj;
    LPVOID parametres = pParams->parametres;
    //...
     
    //traitement éventuel sur la structure de paramètres:
    //delete par exemple, ou encore activation d'un event dans la fonction appelante...
    //Dans cet exemple, delete
    delete pParams;
     
    //Appel de la procédure de thread
    return pObj->VThreadProc(parametres);
    }
    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.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Comment faire?!?
    Il faut binder this à &GM::THREAD::lancer_thread.
    Boost ftw

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Ok, je suis donc obliger de rendre ma fonction statique,
    Merci à tous!!

    Bonne soirée.

    PS : DSL pour la FAQ, j'ai pensé à faire une recherche mais je l'ai complètement zappée.
    Pourquoi faire simple quand on peut faire compliqué!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    J'ai mis à jour mon code pour le lancement...
    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.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 09/03/2013, 19h12
  2. Réponses: 4
    Dernier message: 24/08/2011, 18h23
  3. Réponses: 7
    Dernier message: 05/04/2011, 17h19
  4. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  5. Réponses: 10
    Dernier message: 18/04/2007, 17h17

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