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

Threads & Processus C++ Discussion :

Thread dans une classe ? [FAQ]


Sujet :

Threads & Processus C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Thread dans une classe ?
    Bonjour,

    J'ai un petit souci avec l'utilisation des threads.
    Mon programme contient en fait un socket, qui doit recevoir des données, pour ceci je créé un thread afin de ne pas bloquer le reste du programme.
    Mon socket est déclaré comme membre privé de ma classe, et j'ai une méthode, publique, qui permet de lancer le thread d'écoute de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Socket {
    	public:
    		Socket();
    		~Socket();
    		void EcouteDonnees();
        private:
    		SOCKET sock;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Socket::EcouteDonnees()
    {
    	DWORD ThreadId;
    	CreateThread(NULL, 0, ThreadEcouteDonnees, NULL, 0, &ThreadId);
    }
    Le seul problème maintenant, c'est que je ne sais pas "comment" faire mon thread... Je m'explique :
    - Soit je créé un thread "normal", donc un thread externe à ma classe, mais à ce moment je ne pourrai pas accéder au membre "sock" de me classe, donc impossible de lire des données.
    - Soit je créé mon thread comme étant une méthode de ma classe, c'est ce que j'ai fait, mais j'obtiens alors une erreur de ce type :

    ....(42) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
    A noter que le code de création du thread est exactement le même que ci-dessus. La définition de mon thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DWORD WINAPI Socket::ThreadEcouteDonnees(LPVOID lParam)
    {
    	....
    	return 0;
    }
    Voilà, si quelqu'un a une idée lumineuse, je suis tout ouïe...
    Merci !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    J'ai eu le meme probleme, tout simplement parce que les pointeurs sur methode en C++ ne s'ecrivent pas pareil que les pointeurs sur fonction en C.
    Je n'ai pas retester, mais la syntaxe d'un pointeur sur methode est la suivante dans ton cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CreateThread(NULL, 0, this->*ThreadEcouteDonnees, NULL, 0, &ThreadId);
    en remplacant this par le nom de ta classe.
    Dans le cas ou ca ne serait pas un pointeur, ce la sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Class c;
    c.*ma_methode;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse, au début j'avais essayé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Socket::EcouteDonnees()
    {
    	DWORD ThreadId;
    	CreateThread(NULL, 0, this->ThreadEcouteDonnees, NULL, 0, &ThreadId);
    }
    Mais j'avais alors le message d'erreur que j'ai cité plus haut.
    Je viens d'essayer d'ajouter l'astérisque après le this et voilà ce que j'obtiens :

    ...(42) : fatal error C1001: INTERNAL COMPILER ERROR
    (compiler file 'msc1.cpp', line 1786)
    Please choose the Technical Support command on the Visual C++
    Help menu, or open the Technical Support help file for more information
    :shock:

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La fonction demandée par CreateThread ne peut pas être une fonction membre, car qui dit fonction membre dit objet pour l'appeler. Donc ce qu'on fait en général c'est de passer l'objet en question en paramètre à la procédure du thread, puis d'appeler la bonne fonction membre ensuite.

    Petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CreateThread(NULL, 0, ThreadEcouteDonnees, this, 0, &ThreadId);
     
    DWORD WINAPI ThreadEcouteDonnees(LPVOID lParam)
    {
       Socket* s = reinterpret_cast<Socket*>&#40;lParam&#41;;
       s->EcouterDonnees&#40;&#41;;
     
       return 0;
    &#125;
    C'est au moins la 3ème fois que je fais ce post sur ce forum


    PS : la syntaxe pour récupérer un pointeur sur une fonction membre ça aurait plutôt été Socket::ThreadEcouteDonnees.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Loulou24
    C'est au moins la 3ème fois que je fais ce post sur ce forum
    Désolé !
    Ok ça mache nikel maintenant merci ! ^^

    J'ai juste un autre souci :
    Il paraît que la fonction recv est bloquante, mais elle n'en a pas l'air !
    Dans mon thread j'appelle la fonction recv et juste après j'affiche une MessageBox avec le contenu du buffer de destination. Le problème c'est que mon programme passe sur la fonction recv et juste après il affiche la MessageBox alors que je n'ai envoyé aucune donnée ! Elle n'a donc pas vraiment l'air bloquante...
    J'ai recherché de l'aide sur ce topic :
    http://www.developpez.net/forums/vie...light=bloquant

    Et j'ai essayé de le mettre en mode non bloquant mais recv me retourne toujours -1 même après que j'aie envoyé des données...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    Il n'ya donc pas moyen dans les methodes privees d'une classe d'appeler la fonction CreateThread en passant en parametre un pointeur sur methode?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par darkalia
    Il n'ya donc pas moyen dans les methodes privees d'une classe d'appeler la fonction CreateThread en passant en parametre un pointeur sur methode?
    Non, car le type du paramètre attendu par CreateThread est une fonction non-membre.

    Il attend ça :
    unsigned long (__stdcall *)(void *)
    alors qu'une fonction membre (de Socket ici) aurait comme type ceci :
    unsigned long (__thiscall Socket::*)(void *)

    Et puis cela impliquerait de toujours passer comme paramètre une instance de classe, pour appeler ladite fonction membre.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Bon problème résolu, je vais quand même mettre la solution pour si quelqu'un se trouve un jour dans la même situation que moi. ^^

    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
    void Socket&#58;&#58;EcouteDonnees&#40;&#41;
    &#123;
    	DWORD ThreadId;
    	CreateThread&#40;NULL, 0, ThreadEcouteDonnees, &#40;SOCKET *&#41;this->sock, 0, &ThreadId&#41;;
    &#125;
     
    DWORD WINAPI ThreadEcouteDonnees&#40;LPVOID lParam&#41;
    &#123;
    	char *pcDonnees;
    	int nDonneesRecues;
     
    	pcDonnees = &#40;char *&#41;malloc&#40;255&#41;;
    	memset&#40;pcDonnees, 0, 255&#41;;
     
    	while&#40;1&#41;
    	&#123;
    		nDonneesRecues = recv&#40;&#40;SOCKET&#41;lParam, pcDonnees, 255, 0&#41;;	
    		MessageBox&#40;NULL, pcDonnees, "Donnees recues", MB_OK&#41;;
    		Sleep&#40;0&#41;;
    	&#125;
     
    	return 0;
    &#125;
    Voilà voilà.
    Merci beaucoup Loulou !

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

Discussions similaires

  1. [Débutant] Cross Threading dans une class perso
    Par a.floranc dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/08/2013, 14h01
  2. Thread dans une classe et copie
    Par Markand dans le forum SL & STL
    Réponses: 5
    Dernier message: 01/06/2013, 00h50
  3. Problème thread dans une autre classe
    Par Shypster dans le forum C#
    Réponses: 19
    Dernier message: 06/03/2008, 10h23
  4. Thread dans une classe
    Par superpok dans le forum C#
    Réponses: 8
    Dernier message: 22/08/2007, 03h20
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 09h15

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