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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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

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