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 :

Probleme cast vers type reel.


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Probleme cast vers type reel.
    Bonjour,

    Je dispose d'une class abstraite AThread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class AThread
    {
      private:
        bool _started;
        pthread_t _thread;
     
      public:
        AThread();
        virtual ~AThread();
        void start();
        virtual void callback() = 0;
    };
    La methode start est chargée de lancer le thread.
    La methode callback doit etre implemente par les class qui herite de AThread; celle-ci est la methode que le thread doit appeller.

    Pour ce faire, j'ai cree une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    extern "C"
    {
      void *thread_func(void *mem)
      {
         AThread *obj;
     
         obj = static_cast<AThread *>(mem);
         obj->callback();
         return (NULL);
      }
    }
    Cette fonction est donc appellee comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void AThread::start()
    {
      if (!this->_started)
      {
        this->_started = true;
        pthread_create(&this->_thread, NULL, thread_func, this);
      }
    }
    Cependant lors d'un appel a la methode start, la methode thread_func appelle la methode callback de l'objet AThread dans tous les cas.
    J'ai essaye de static_cast ver le type reel, de passer la reference du type reel a thread_func mais le resultat reste le meme:

    pure virtual method called
    terminate called without an active exception
    Aborted

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Tu n'essaierais pas d'appeler start dans le constructeur de AThread par hasard, c'est à dire avant que le constructeur de la classe dérivée n'ait terminé d'instancier l'objet ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Tu n'essaierais pas d'appeler start dans le constructeur de AThread par hasard, c'est à dire avant que le constructeur de la classe dérivée n'ait terminé d'instancier l'objet ?
    Bien essaye mais non. Merci quand meme.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    On peut voir le constructeur de AThread et celui de la classe dérivée posant problème ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par cob59 Voir le message
    On peut voir le constructeur de AThread et celui de la classe dérivée posant problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    AThread::AThread()
    :_started(false)
    {
     
    }
    Le constructeur de la classe qui herite de AThread ne fait absolument rien.

  6. #6
    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 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    Est-ce qu'un dynamic_cast vers le type réel fonctionne ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Est-ce qu'un dynamic_cast vers le type réel fonctionne ?
    Non plus

  8. #8
    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 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    C'est-à-dire ?
    Le pointeur est NULL ? Ou l'erreur reste la même ?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Visiblement le probleme ne vient pas du "cpp" mais plutot des thread.
    Si je sleep apres l'appelle a start ca fonctionne.
    Pas plus de detail sur la resolution du probleme.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Probleme resolu.
    En fait, le destructeur de AThread se presente comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    AThread::~AThread()
    {
      if (this->_started)
        pthread_join(this->_thread, NULL);
    }
    Quant au main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
       C c;    // C herite de AThread
       c.start()
       return (0);
    }
    Du coup, lors de la destruction de C, le thread n'est pas encore lance, du coup il ne join pas et dans le callback (qui est donc executer apres la destruction de l'objet) il cherche a appeller la methode callback de l'objet qui vient d'etre detruit.

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

Discussions similaires

  1. [AC-2010] Probleme CAST nombre dans requête SQL vers Access
    Par GreatTeacherOnizuka dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/07/2014, 15h12
  2. Cast vers un type plus grand et perte de precision
    Par Kaluza dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2012, 12h12
  3. Réponses: 2
    Dernier message: 07/03/2007, 15h27
  4. Réponses: 2
    Dernier message: 30/08/2004, 15h48
  5. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 11h46

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