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 :

Appel fonction member par pthread_create


Sujet :

C++

  1. #21
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 159
    Points
    3 159
    Par défaut
    Je ne reviens pas sur comment passer l'objet en paramètre, la question a été adressée correctement. En revanche, il faut être rigoureux sur la gestion du cycle de vie des objets :
    - Si chaque thread doit avoir son objet, alors il ne faut pas stocker this qui est à chaque fois un pointeur vers le même objet. Il faut en créer un nouveau pour chaque thread.
    - L'objet est-il toujours en vie lorsque les threads s'exécutent ? Si l'objet est créé avant de lancer les threads et détruit alors que ceux-ci s'exécutent encore, tu vas avoir des ennuis. Le code montré ne permet pas de savoir si c'est le cas ou pas.

    Lorsque je vois ça, j'ai l'impression que tu manques de maîtrise sur la notion de pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_threads[1]->o = new Class;
    m_threads[1]->o = this;
    Ca c'est fuite de mémoire direct. m_threads[1]->o = this est une copie de pointeur, ça n'affecte pas les objets pointés.

    N'oublie pas de passer un memory checker sur ton exécutable, car on fait vite des erreurs avec ce genre de code.

  2. #22
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 203
    Points : 12 359
    Points
    12 359
    Par défaut
    les deux objets travaillent sur le même objet alors qu ils devraient avoir chacun leur copie
    Moi, je suis très très dubitatif sur l'architecture générale qui nécessite cela.
    Si vous pouvez vous contenter d'un simple objet MyClass "vierge" comme objet de contexte, j'aurais fais une fonction libre qui créerait cet objet en début de fonction, et puis c'est tout.

    Sinon, en C++11, std::thread :
    http://stackoverflow.com/questions/1...ember-function

  3. #23
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 072
    Points
    33 072
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je n'aime pas, car je veux garder accès aux autres fonctions/membres, de la classe.
    Tu n'aimes pas alors que c'est strictement équivalent ?

    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
     
    class A {
    public:
    static void CB(void* arg)
    {
     A* pThis = (A*)arg;
     pThis->Do();
     std::cout<<pThis->str<<pThis->s;
     pThis->Dodo();
    }
     
    void StartThread()
    {
    pthread_create( &thread1, NULL, A::CB, this);
    }
     
    void Do() {}
    std::string str;
     
    private:
    void Dodo() {}
    std::string s;
    };
    Je vois pas ce qui pouvait être compris de travers .. et ce que tu as pu comprendre.

  4. #24
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 203
    Points : 12 359
    Points
    12 359
    Par défaut
    Bousk, c'est pas parce que c'est du code "low level" qui faut mettre des cast à la C dans du C++.
    reinterpret_cast est ton ami.

  5. #25
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 921
    Points : 220 492
    Points
    220 492
    Billets dans le blog
    127
    Par défaut
    @Bousk : c'est après, que je me suis rappelé que le compilateur ne fera pas son erreur de compilation, en disant que le pointeur de fonction n'est pas compatible avec ce que attend pthread_create(). Et oui, ainsi, je suis d'accord et je vais peut être changé ma version pour adopter la votre.

  6. #26
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Bousk, c'est pas parce que c'est du code "low level" qui faut mettre des cast à la C dans du C++.
    reinterpret_cast est ton ami.
    static_cast plutôt quand il faut convertir vers/depuis du void*. En tout cas officiellement (à moins que cela ait changé en 2011; http://stackoverflow.com/a/311178/15934 ; et dans le n4296 je ne retrouve pas le patch évoqué ici: http://www.open-std.org/jtc1/sc22/wg...ects.html#1120) -- je soupçonne que c'est parce qu'il n'y a pas la garantie que sizeof(T*) == sizeof(void*) partout, plus autres problèmes d'alignements ; à re-vérifier éventuellement.

    Sinon ... std/boost::thread, c'est bien aussi -- et il y avait la FAQ accessoirement: http://cpp.developpez.com/faq/cpp/?p...ur-de-fonction (au mauvais cast près)

Discussions similaires

  1. [PHP-JS] Appel de fonction PHP par JS
    Par pat06 dans le forum Langage
    Réponses: 5
    Dernier message: 29/11/2007, 10h03
  2. Réponses: 6
    Dernier message: 07/06/2007, 15h27
  3. Appel de fonctions php par variable
    Par WagaSeb dans le forum Langage
    Réponses: 2
    Dernier message: 02/06/2007, 12h06
  4. appeler une fonction définit par l'utilisateur
    Par paumi dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/05/2007, 01h00
  5. [VB.Net] Problème appel fonction par un bouton
    Par balibo dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/11/2005, 11h48

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