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 :

Méthode de classe "threadée"


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Par défaut Méthode de classe "threadée"
    Bonjour,
    au sein d'une de mes classes, j'aimerais qu'une méthode en lance une autre, mais dans un autre thread.
    Pour cela, j'utililse une méthode statique temporaire (comme vu sur développez.com) de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static DWORD WINAPI runBufferThread(void *p)
    {
    	struct threadParam* param = reinterpret_cast<threadParam*>(p);
    	VideoRenderer *renderer = param->renderer;
    	return renderer->testThread();
    }
    auquel je passe une structure de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct threadParam param;
    DWORD ThreadId;
    param.renderer = this;
    CreateThread(NULL, NULL, &VideoRenderer::runBufferThread, &param, NULL, &ThreadId);
    J'arrive alors à récupérer le "this" pour lancer une méthode dans le thread, par contre, tous les attributs de ce "this" (vector et int) se retrouvent non initialisés (alors qu'ils le sont dans le constructeur).
    Comment faire pour résoudre ce pb ?
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    L'objet est sur la pile, il est donc détruit avant que la fonction de thread n'arrive dessus.
    Passe un pointeur vers un objet alloué dynamiquement.

    PS: Au fait, c'est static_cast<> pour un 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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Par défaut
    Tu veux dire que je ne pourrai pas passer en paramètre mon "this" ?
    Je ne peux passer que ses attributs créés dynamiquement ?

    Si je ne passe pas le "this" comment faire pour lancer en thread un de ses fonctions ?
    Désolé, mes questions sont peut etre betes, mais tout ca c'est assez nouveau pour moi...
    Merci

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    C'est param qu'il faut allouer dynamiquement.
    Une fois la structure allouée, tu pourras mettre ton this dedans sans problème.
    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.

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Par défaut
    J'alloue mon param dynamiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct threadParam* param = new threadParam();
    DWORD ThreadId;
    param->renderer = this;
    CreateThread(NULL, NULL, &VideoRenderer::runBufferThread, param, NULL, &ThreadId);
    j'arrive toujours à appeler la methode sur "param->renderer"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static DWORD WINAPI runBufferThread(void *p)
    {
    	struct threadParam* param = static_cast<threadParam*>(p);
    	VideoRenderer *renderer = param->renderer;
    	return renderer->testThread();
    }
    mais j'ai encore le pb. En particulier, mon "vector" n'est pas initialisé et j'ai donc un "pb de dépassement" lorsque que je fais l'opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DWORD VideoRenderer::testThread()
    {
            int i = 0;
    	while(true)
    	{
    		Frame* temp = tab_frames[3];
    		i++;
    	}
    	return 0;
    }
    Pour info, l'erreur exacte est "vector subscript out of range"

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Quel est la durée de vie de ton objet principal ?
    L'important, c'est être certain qu'il soit "encore là" du début à la fin du thread.

    Tu peux déboguer, en mettant un flag à 1 dans le destructeur, et en le testant dans le thread. Si le flag est à 1 dans le thread, ça veut dire que l'objet a été détruit...
    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.

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