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] CSocket et thread


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut [MFC] CSocket et thread
    Bonjour

    Dans un appli dialog based j'ai une classe heritant d'une CSocket
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class CClntSock : public CSocket
    Cette classe derive la methode OnReceive afin de travailler avec des socket asynchrone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void OnReceive(int nErrorCode);
    Dans ma dialog j'ai besoin de plusieurs de ces classes donc dans le .h de la dialogue je declare n pointeurs vers cette classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CClntSock *m_pClientSock[NB_MAX_CONTROLER];
    Dans le initdialog je cree les nouveaux elements et je les initialise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(i = 1; i <= Nb_Reader; i++) 
    {
    if ((m_pClientSock[i] = new CClntSock) != NULL)
    {
    if (m_pClientSock[i]->Create())
    {
    if (!m_pClientSock[1]->Connect(m_pClientSock[1]->m_IpAddress,m_pClientSock[1]->m_Portnum))
    }
     
    }
    }
    Si je n'est pas d'erreur tout va bien et je recoit comme je le veux par la méthode overide OnReceive

    Par contre Je souhaite que ce traitement ce fasse dans n different thread afin de ne pas etre bloqué sur un connect
    donc en modifiant mon code en
    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
     
    typedef struct MYVAR_READER{
     
    	HWND	*phObjectHandle;
    	CClntSock *m_pClientSock;
    	short Nb_Reader;
     
    }MYVAR_READER;
    void CServeurDlg::RunReader(void)
    {
    	int i;
    	MYVAR_READER* TheVarThread[NB_MAX_CONTROLER]; 
    	for(i = 1; i <= Nb_Reader; i++) 
    	{
    		if ((m_pClientSock[i]->bEnabled) && (!m_pClientSock[i]->bInitRunning))
    		{
    			phObjectHandle = GetSafeHwnd();
    			TheVarThread[i] = new MYVAR_READER;
    			TheVarThread[i]->phObjectHandle = &phObjectHandle;
    			TheVarThread[i]->Nb_Reader = Nb_Reader;
    			TheVarThread[i]->m_pClientSock = m_pClientSock[i];
    			m_pClientSock[i]->pThread = AfxBeginThread(InitReader_thread,TheVarThread[i]);
    			m_pClientSock[i]->bInitRunning = true;
    		}
     
    	}
    et en ayant lancé les thread passe dans les fonctions suivantes
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    UINT CServeurDlg::InitReader_thread( LPVOID Param )
    {
    	int i;
    	MYVAR_READER* TheVarIn = (MYVAR_READER*)Param;
     
     
    		if (!TheVarIn->m_pClientSock->bConnected) 
    		{
    			::PostMessage(*TheVarIn->phObjectHandle, WM_TRY_CONNECT, 0, (LPARAM)TheVarIn->m_pClientSock->m_rang);
    			TheVarIn->m_pClientSock->bConnected = ConnectReader(TheVarIn->m_pClientSock);
    			::PostMessage(*TheVarIn->phObjectHandle, WM_FIN_CONNECT, 0, (LPARAM)TheVarIn->m_pClientSock->m_rang);
    		}
     
    	::PostMessage(*TheVarIn->phObjectHandle, WM_FIN_THREAD, 0, (LPARAM)TheVarIn->m_pClientSock->m_rang);
    	delete (TheVarIn);
    	return 1;
    }
    bool CServeurDlg::ConnectReader(CClntSock* myreader)
    {
    	if (myreader->Create())
    	{
    		if (myreader->Connect(myreader->m_IpAddress,myreader->m_Portnum))
    		{			
    			return true;
    		}
    		else
    		{
    			myreader->Close();
    			myreader->ErrorCode = Socket_Not_Connected;
    			return false;
    		}
    	}
    	else
    	{
    		myreader->ErrorCode = Socket_Not_Create;
    		return false;
    	}
     
    return true;
    mes connection se font bien, les thread s'arrete normalement mais je ne passe plus dans la fonction On receive de chacunes des classes
    et je ne recois plus rien!

    Quelle est la difference du point de vue de la classe CSocket connecter dans un thread ou non!

    Cordialement

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Autrement dit

    Le thread actuellement s'arrete apres le create et la connection , faut t-il le laisser continuer pour acceder a la fonction overide ?

    Je pensais ne faireque le create et le connect en parallele et qu'apres les fonctions overide erait ma reception afin d'eviterla lourdeur du code pour creer des message privé pour dialouer avec sa fenetre

    cordialement

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    on général on créé la socket serveur puis on appel la méthode listen().
    ensuite sur chaque de demande de connection cliente la méthode OnAccept est appelée et c'est la que la socket cliente est crée.
    tu ne devrais pas avoir besoin de thread pour faire cela.
    je pense que la classe CSocket MFC avec son système de messages internes supporte mal d'être mise dans un thread..
    j'ai un service serveur qui tourne sur ce principe et je n'ai pas eu besoin de thread.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    En faite l'appelation de serveur dans mon cas est un peu exagéré.
    Ce n'est pas un reel client serveur, j'essaye de me connecter a des systèmes qui peuvent etre assimiler a des "routeur WIFI " qui sans reel protocoles envoi des data par socket.Si c'est data ne sont pas traité elle sont perdues.

    Je n'emploie donc pas de listen ( car je ne peux pas) juste un create, une socket asynchrone et je recupere les données. Mon souhait d'utiliser des threads et de gerer les connexions et deconnexions de ces "routeurs wifi" environ une cinquantaine qui doivent fonctionner en parallele pour rn pas pedre mes données si un a perdu sa connexion ou a echoué a ce connecté

    Cordialement

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    alors essaye plutôt de créer un thread d'interface la socket client étant membre de ta classe héritée de CWinThread.
    ton processus de connection devra se faire dans le méthode initInstance de ta classe .
    schématiquement cela donne ceci:
    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
     
    class CSockThread : public CWinThread
    {
     public:
     
    protected:    
    CClntSock m_Socket;
    //..
    };
    BOOL CSockThread::InitInstance()
     {
           // connexion de la socket cliente..
            return TRUE;
     } 
     // demarrage du thread
    CSockThread* pSockThread = (CSockThread*)AfxBeginThread(       RUNTIME_CLASS(CSockThread) );

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Meme avec une classe d'interface, j'ai toujours le meme problème.
    Les connexions se font bien mais je ne passe plus dans la methode onReceive de ma CAsyncSocket.

    Je comprend pas...

    Codialement

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    C'est completement idiot mais un creant mon thread , creant la socket asynchrone dedans ,en la connectant puis en appelant la methode Onreceive
    J'ai bien mes data, en fait dans le thread je n'ai pas de redirection vers le onReceive ou je n'est pas de detection de data presentes
    une idée ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 4
    Par défaut
    Salut,

    J'ai le meme probleme, J'ai fait un client udp en mfc avec CAsyncSocket qui fonctionne et que j'ai ensuite integré dans une dll, mon OnReceive n'est jamais appellé et je suis obligé de forcer manuellement ma reception!!

    Si tu a trouvé une solution je suis prenneur!
    Merci,

Discussions similaires

  1. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  2. [MFC] CSocket | perte de données
    Par Grey dans le forum MFC
    Réponses: 2
    Dernier message: 24/11/2005, 10h14
  3. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21
  4. [MFC] CSocket et Thread
    Par Kevgeii dans le forum MFC
    Réponses: 5
    Dernier message: 10/08/2005, 22h38
  5. [MFC] CSocket ... problème à la fermeture
    Par Yellowmat dans le forum MFC
    Réponses: 7
    Dernier message: 29/04/2005, 15h37

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