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 averti
    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
    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 averti
    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
    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 averti
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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*>(lParam);
       s->EcouterDonnees();
     
       return 0;
    }
    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 averti
    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
    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 averti
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 averti
    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
    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::EcouteDonnees()
    {
    	DWORD ThreadId;
    	CreateThread(NULL, 0, ThreadEcouteDonnees, (SOCKET *)this->sock, 0, &ThreadId);
    }
     
    DWORD WINAPI ThreadEcouteDonnees(LPVOID lParam)
    {
    	char *pcDonnees;
    	int nDonneesRecues;
     
    	pcDonnees = (char *)malloc(255);
    	memset(pcDonnees, 0, 255);
     
    	while(1)
    	{
    		nDonneesRecues = recv((SOCKET)lParam, pcDonnees, 255, 0);	
    		MessageBox(NULL, pcDonnees, "Donnees recues", MB_OK);
    		Sleep(0);
    	}
     
    	return 0;
    }
    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, 13h01
  2. Thread dans une classe et copie
    Par Markand dans le forum SL & STL
    R�ponses: 5
    Dernier message: 31/05/2013, 23h50
  3. Probl�me thread dans une autre classe
    Par Shypster dans le forum C#
    R�ponses: 19
    Dernier message: 06/03/2008, 09h23
  4. Thread dans une classe
    Par superpok dans le forum C#
    R�ponses: 8
    Dernier message: 22/08/2007, 02h20
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum G�n�ral Java
    R�ponses: 5
    Dernier message: 03/06/2004, 08h15

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