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 :

Lancement de threads à l'intérieur d'une classe


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 65
    Points
    65
    Par défaut Lancement de threads à l'intérieur d'une classe
    Bonjour,

    J'ai défini une classe du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MaClasse
    {
      public:
        DWORD WINAPI Methode1(LPVOID S);
        DWORD WINAPI Methode2(LPVOID S);
    ...
    }
    où Methode1 et Methode2 correspondent à des threads.

    Dans Methode1, j'essaie de lancer le thread Methode2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned long thread_id;
    HANDLE threadhandle=CreateThread(NULL,0,Methode2,0,0,&thread_id);
    mais, à la compilation, j'ai l'erreur suivante :
    error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
    J'ai essayé de caster mais c'est impossible car __stdcall n'est pas un type. A mon avis, le problème vient du fait que mes threads sont des methodes et non des fonctions. Quelqu'un a-t-il déjà rencontré le problème ? Y a-t-il un moyen de le résoudre ou tout au moins pouvez-me donner une explication de ce qu'il se passe réellement ?

    Merci.

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Déja déclare tes méthodes en Static car leur adresse doivent être connue à la compilation si ceux sont des fonctions de threads
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class MaClasse
    {
      public:
        static DWORD WINAPI Methode1(LPVOID S);
        static DWORD WINAPI Methode2(LPVOID S);
    ...
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 65
    Points
    65
    Par défaut
    J'ai essayé mais çà ne résoud pas mon problème. Voici le code et les erreurs, si quelqu'un trouve la solution, je le remercie d'avance.

    fichier .h :
    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
    #include <afxmt.h>
     
    class MaClasse
    {
    public: 
    	// constructeur
    	MaClasse(){ 
    		nombre = 12; }
    	// Destructeur
    	~MaClasse()	{ }
     
    	// une variable entière
    	int nombre;
     
    	// deux fonctions de threads
    	static DWORD WINAPI Methode1( MaClasse* Param );
    	static DWORD WINAPI Methode2( MaClasse* Param );
    };
    Fichier .cpp :
    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
    24
    25
    26
    27
    28
    29
    30
    #include "threadclasstest.h"
     
    // thread : Methode1
    DWORD WINAPI MaClasse::Methode1( MaClasse* Param )
    {
    	printf ("On est dans méthode 1, nombre = %i\n",Param->nombre);
    	DWORD* IdMethode2;
    	CreateThread(NULL, NULL, Param->Methode2, Param, NULL, IdMethode2);
    	printf ("Methode 2 lancée par methode 1\n");
    }
     
    // thread : Methode2
    DWORD WINAPI MaClasse::Methode2( MaClasse* Param )
    {
    	printf ("On est dans methode 2, nombre = %i\n",Param->nombre);
    	Param->nombre = 10;
    	printf ("On modifie nombre, nombre = %i\n",Param->nombre);
    }
     
    // Programme principal
    int main()
    {
    	MaClasse MonObjet;
     
    	DWORD* IdMethode1;
    	CreateThread(NULL,NULL,MonObjet.Methode1,MonObjet,NULL,IdMethode1);
    	// on s'endort 10 secondes
    	Sleep(10000);
    	return 0;
    }
    Et les erreurs du compilateur :
    error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (class MaClasse *)' to 'unsigned long (__stdcall *)(void *)'
    None of the functions with this name in scope match the target type
    error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (class MaClasse *)' to 'unsigned long (__stdcall *)(void *)'
    None of the functions with this name in scope match the target type
    Voilà, si vous avez une idée ?
    Merci.

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Normal,
    Pourquoi as tu en plus changé le type de paramètre de tes fonctions ?
    Remet LPVOID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static DWORD WINAPI Methode1( LPVOID Param );

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 65
    Points
    65
    Par défaut
    Je suis obligé car je ne peux pas accéder à mes variables membres sinon. Donc, je passe l'instance de ma classe en paramère afin de pouvoir modifier ma variable nombre. Sinon, j'ai l'erreur suivante :
    error C2597: illegal reference to data member 'MaClasse::nombre' in a static member function
    Je me suis référé à la doc MSDN :
    Compiler Error C2597
    illegal reference to data member 'member' in a static member function

    The identifier you specified is a member of the class. However, it is nonstatic and the current function is a static member function. To access the member, an instance of the class must be provided and accessed using the . or -> operators.

    The specified identifier was not a member of a class, structure, or union.

    A member access operator (. or ->) was used to refer to a function that was not defined as a member of the class, structure, or union.

    The following code in a .cpp file will generate C2597:

    struct s1 {
    static void func();
    int i;
    };

    void s1::func()
    {
    i = 1; // error C2597 here
    }

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Il faut bien garder LPVOID car c'est la signature de la fonction de thread qui le spécifie. Et la fonction CreateThread s'attend à recevoir ce type de fonction.
    Par contre rien ne t'êmpêche de passer un pointeur MaClasse * à la place d'un LPVOID
    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
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include "threadclasstest.h"
     
    // thread : Methode1
    DWORD WINAPI MaClasse::Methode1( LPVOID Param )
    {
       printf ("On est dans méthode 1, nombre = %i\n",((MaClasse*)Param)->nombre);
       DWORD* IdMethode2;
       CreateThread(NULL, NULL, MaClasse::Methode2, Param, NULL, IdMethode2);
       printf ("Methode 2 lancée par methode 1\n");
    }
     
    // thread : Methode2
    DWORD WINAPI MaClasse::Methode2(LPVOID Param )
    {
       printf ("On est dans methode 2, nombre = %i\n",((MaClasse*)Param)->nombre);
       ((MaClasse*Param)->nombre = 10;
       printf ("On modifie nombre, nombre = %i\n",((MaClasse*)Param)->nombre);
    }
     
    // Programme principal
    int main()
    {
       MaClasse MonObjet;
     
       DWORD* IdMethode1;
       CreateThread(NULL,NULL,MonObjet.Methode1,(LPVOID)MonObjet,NULL,IdMethode1);
       // on s'endort 10 secondes
       Sleep(10000);
       return 0;
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 65
    Points
    65
    Par défaut
    Cà marche !! C'est génial. Par contre, il y a juste une modif à faire dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateThread(NULL,NULL,MonObjet.Methode1,(LPVOID)&MonObjet,NULL,IdMethode1);
    Il faut passer l'adresse de l'objet en paramètre du thread.
    Encore MERCI.

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

Discussions similaires

  1. Classe à l'intérieur d'une classe ?
    Par hsoussou dans le forum Débuter
    Réponses: 12
    Dernier message: 14/01/2009, 13h23
  2. Réponses: 6
    Dernier message: 14/12/2008, 02h12
  3. Réponses: 5
    Dernier message: 04/12/2008, 23h08
  4. Thread et donnée d'une classe
    Par Bayard dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 12/03/2007, 12h54
  5. [Système] Tri à l'intérieur d'une classe
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2006, 22h54

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