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

MFC Discussion :

[MFC] rendre un thread membre d'une classe.


Sujet :

MFC

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut [MFC] rendre un thread membre d'une classe.
    Bonjour. JE rencontre un petit soucis pour rendre un thread membre d'une classe.

    Si je crée le thread dans ma classe en tant que membre static pas de probleme. En revanche lorsque je ne le met pas static (car je veux que chaque objet ait son thread) le compilateur ne reconnais plus le type.

    plus exactement, voici le protho de mon thread :

    DWORD WINAPI MyThread(LPVOID lParam);

    Et voici ce que me répond le compilateur sur un CreateThread :

    CreateThread (NULL,0,MyThread,NULL,NULL,NULL);

    error C2664 'CreateThread' cannot convert parameter 3 from 'DWORD (LPVOID)' to 'LPTHREAD_START_ROUTINE'

    Savez vous pourquoi quand mon thead n'est pas statique, le compilateur igore le WINAPI et voit mon thread comme une simple fonction membre?

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    si ta "fonction thread" n'est pas static, il faudrait une instance de ta classe pour pouvoir lancer ton thread et ce n'est pas la vocation de CreateThread. Il n'a pas à instancier de classe.

    pour ce que tu souhaites faire, si tu utilises les MFC, va voir du coté de CWinThread

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    ok merci, je vais regarder ca.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    arf, il n'y a rien a faire meme avec AfxBeginThread , j'obtient exactement la meme erreure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CMaClasse
    {
        CWinRThread* m_pMonThread;
        UINT MonThread(LPVOID pParam);
        void StartThread();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CMaClasse::StartThread()
    {
       m_pMonThread = AfxBeginThread(MonThread,NULL);
    }
    Me retourne un :

    error C2664: 'CWinThread::CWinThread(AFX_THREADPROC,LPVOID)' : cannot convert parameter 1 from 'UINT (LPVOID)' to 'AFX_THREADPROC'
    Pourtant msdn dit bien que le propotype du thread doit etre un UINT NomFnc(LPVOID pParam)

    Alors pourquoi ca n'aime pas comme ca qu'un thread puisse etre membre d'un objet?

  5. #5
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Salut, remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_pMonThread = AfxBeginThread(MonThread,NULL);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_pMonThread = AfxBeginThread((AFX_THREADPROC)MonThread,NULL);
    et ça devrait rouler !

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    c'est la premiere chose que j'avais essayé mais ca me retourne comme quoi ca ne peut pas convertir UINT Maclasse:LPVOID) en AFX_THREADPROC

    Je suis en train d'essayer autre chose, laissé m_pMonThread "local à l'objet" et passer MonThread static.

    J'espere ainsi créer plusieurs instances de Monthread() dont l'adresse sera localement pour chaque objet dans m_pMonThread.

    Du coup je vais devoir donner comme parametre à Monthread(), quel objet MaClasse le lance, pour que interieurement il pointe vers le bon objet MaClasse.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Voila , j'ai fais ma petite modif et ca semble fonctionner. Seulement je maitrise tres mal qu'est ce qui se passe exactement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CMaClasse
    {
        CWinRThread* m_pMonThread;
        static UINT MonThread(LPVOID pParam);
        void StartThread();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CMaClasse::StartThread()
    {
       m_pMonThread = AfxBeginThread(MonThread,this);
    }
     
    UINT CMaClasse::MonThread(LPVOID pParam)
    {
       CMaClasse* maman = ( CMaClasse*) pParam;
    }
    A partir de la, si je fais un :

    CMaClasse toto;
    CMaClasse titi;
    toto.StartThread();
    titi.StartThread();

    Alors toto.m_pMonThread != titi.m_pMonThread chaque objet CMaclasse a donc son thread qui lui est propre.

    Ce que je me demande maintenant, c'est : comme MonThread est static, alors il n'est alloué qu'une fois en mémoire (pour la classe CMaClasse, et non pour chacune de ses instances). Alors comment ca se fait que cela fonctionne... la je suis un peu perdu.

Discussions similaires

  1. Thread avec une fonction membre d'une classe
    Par Krishna dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 15/07/2008, 00h43
  2. Objet vector<Type> membre d'une classe
    Par Chewbi dans le forum SL & STL
    Réponses: 3
    Dernier message: 16/02/2006, 18h12
  3. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 14h49
  4. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 09h15
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 02h15

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