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] Threads et Notifications (OnReceive, etc)


Sujet :

MFC

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut [MFC] Threads et Notifications (OnReceive, etc)
    Bonjour, c'est encore moi ^^"

    D�cidement chaque fois que je r�gle un probl�me, j'en ai un autre ;_;

    J'utilise des sockets dans des threads, pour pouvoir utiliser les notifications d'�v�nements comme le OnReceive, il faut faire un detach du handle du socket avant de rentrer dans la thread, et faire un attach(handle) � l'initialisation de la thread.

    Jusque l� tout va bien, mais je n'ai aucune notification qui se d�clenche, je ne comprends pas vraiment pourquoi �a ne fonctionne pas.

    Je mets la code de mon appel de thread :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    	pThreadReceive =  (MyThreadRS*)AfxBeginThread( RUNTIME_CLASS( MyThreadRS ), THREAD_PRIORITY_NORMAL,  0,  CREATE_SUSPENDED);
    Mon code de detach et de resume thread (dans ma thread principale) :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    hConnected = incomingSock->Detach();
    pThreadReceive->ResumeThread();
    Et le code de ma thread :

    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
    BOOL MyThreadRS::InitInstance()
    {
    	Connection *m_connect = new Connection;
    	m_sConnected.Attach(hConnected);
    	TRACE("MyThreadRS::InitInstance\n");
    	if (!AfxSocketInit())
    	{
    		return FALSE;
    	}
    	InitFile();
    	while(true)
    	{
    		SingleStep();
    		Sleep(2000);
    	}
    	m_sConnected.Detach();
    	return TRUE;	
    }
    void MyThreadRS::SingleStep()
    {
    	ARGUMENTS    MyArguments;
    	if(!m_pArOut->IsBufferEmpty())
    	{
    		m_pArOut->Write(&MyArguments, sizeof(ARGUMENTS));
    		m_pArOut->Flush();
    		TRACE("MyThreadRS::SingleStep : m_pArOut Flush\n");
    	}
    	TRACE("MyThreadRS::SingleStep\n");
    }
    void MyThreadRS::InitFile()
    {
    	m_pFile  = new CSocketFile(&m_sConnected);
    	m_pArIn  = new CArchive(m_pFile,CArchive::load);
    	m_pArOut = new CArchive(m_pFile,CArchive::store);
    	TRACE("MyThreadRS::InitFile\n");
    }
    Le Sleep n'est l� que pour ne pas avoir trop de trace en �x�cution.

    En plus, au d�but de l'enclenchement de ma thread, je fais un flush d'une structure vide mais �a passe en �x�cution.

    Je devrais avoir des notifications d'�v�nement normalement mais je n'en ai pas...
    Peut etre que j'ai mal compris ce qu'il est mis dans MSDN... (je mets les liens au cas o�)

    http://support.microsoft.com/default.aspx?scid=kb;EN-US;175668
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_wcemfc4/html/aflrfcsocketcolcolattach.asp

    Si quelqu'un connait le probl�me, ce serait gentil de m'aider, je d�sesp�re l� ;_;

  2. #2
    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
    une precision :
    sur la ligne hConnected = incomingSock->Detach();
    le hConnected tel qu'il est ecrit ne fait pas partie du thread g�n�r� .
    moi j'aurais vu plutot:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    pThreadReceive->hConnected = incomingSock->Detach();
    non ?

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Erf oui, je vais voir tout de suite ^^"

    Mais alors je d�clare le handle dans le thread?

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Je viens d'essayer, �a ne fonctionne pas non plus comme �a.

    J'ai d�clar� le handle comme �a :

    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 MyThreadRS : public CWinThread
    {
    	DECLARE_DYNCREATE(MyThreadRS)
     
    public:
    	SOCKET hConnected;
    	Connection *m_connect;
    	CSocket m_sConnected;
    	CSocketFile *m_pFile;
    	CArchive *m_pArIn;
    	CArchive *m_pArOut;
    	~MyThreadRS                 ();
    	void SingleStep             ();
    	void InitFile               ();
    	virtual BOOL InitInstance   ();
    };

  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
    heu pourquoi tu detaches la socket dans initinstance du thread ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    m_sConnected.Detach();

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Bah euh c'est pour le d�tacher quand j'en ai plus besoin, actuellement j'ai une boucle infinie mais plus tard j'aurai une boucle qui aura une autre condition et je pensais qu'il fallait red�tacher le handle quand on avait fini la thread :/

    Je vais voir si �a passe l� quand meme ^^"


    EDIT : Je viens de v�rifier, il ne passe jamais par cette instruction actuellement, donc je ne pense pas que ce soit �a le probl�me

  7. #7
    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
    Note:
    je pas sur que �a soit tres bon de limiter le traitement dans une boucle infinie dans initinstance c'est pas fait pour ....
    de plus la pompe a message du thread risque de ne pas etre actif...


  8. #8
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    C'est parce que je ne sais pas du tout comment s'utilisent ces thread, j'ai fait �a un peu � pouf je dirais, je ne sais pas du tout comment entrer dans une m�thode d'un tel thread, j'ai juste compris que le initinstance est appell� automatiquement :/

  9. #9
    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
    et bien le traitement de reception se fait par la fonction OnReceive
    de la socket cliente cr�er.
    si le thread doit envoyer des donn�es tu envois un message priv� au thread et celui �i devra traiter l'envoi.
    la difference avec un workerthread c'est que ton thread dispose d'une pompe a message.

  10. #10
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Oui mais justement, ma fonction OnReceive n'est jamais appell�e :/

  11. #11
    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
    tu as bien fait le accept de la socket cliente a partir de la socket principale d'attente ?

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Voui, normalement �a c'est ok, je fais comme �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Server::OnAccept(int nErrorCode)
    {
    	/* Le serveur accepte automatiquement les connexions des clients
    	   grâce à la fonction surchargée OnAccept de la classe CAsyncSocket
    	*/
    	CSocket::OnAccept(nErrorCode);
    	TRACE("On Accept Server\n");
    	m_connect->AcceptProcess();
    }
    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
    int Connection::AcceptProcess()
    {
    	TRACE("AcceptProcess de Connection\n");	
    	if (serverSock->Accept(*incomingSock))
    	{
    		TRACE("Connexion acceptee\n");
    		InitArchive(incomingSock);
    		TRACE("(incomingSock = %.8x)\n", incomingSock);
    		pThreadReceive->hConnected = incomingSock->Detach();
    		pThreadReceive->ResumeThread();
    	}
    	else
    	{
    		delete incomingSock;
    		incomingSock = NULL;
    	}
    	return 0;
    }

  13. #13
    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
    pourquoi je ne vois pas la creation de l'objet incomingSock dans ton code ?

  14. #14
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Parce qu'il est dans le constructeur de ma classe :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Connection::Connection()
    {
    	// Création des différents sockets nécéssaires pour les transferts
    	TRACE("Connection : Constructeur\n");
    	serverSock   = new Server(this);
    	clientSock   = new Client(this);
    	incomingSock = new Client(this);
    	m_pFile      = NULL;
    	m_pArOut     = NULL;
    	m_pArIn      = NULL;
    	InitFIFO();
    	InitThread();
    }
    Je dois certainement encore faire une erreur tout b�te quelque part, mais je n'arrive pas � trouver o� ;_;

  15. #15
    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
    autre point la creation du thread devrais se faire dans cette portion de code non ?:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (serverSock->Accept(*incomingSock))
       {
          TRACE("Connexion acceptee\n");
          InitArchive(incomingSock);
          TRACE("(incomingSock = %.8x)\n", incomingSock);
          pThreadReceive->hConnected = incomingSock->Detach();
          pThreadReceive->ResumeThread();
       }

  16. #16
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    En fait je devrai avoir 4 thread en tout, et ils devront etre cr��s qu'on soit cot� serveur ou cot� client, donc je les cr�e � l'inialisation pour ne pas avoir deux fois la meme portion de code dans deux m�thodes diff�rentes.

    Ca peut poser des probl�mes de faire comme �a?

  17. #17
    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
    hum c'est pas clair pour moi,
    le thread client cot� serveur devrait etre cr�� sur l'accept de la connexion cliente.

  18. #18
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    Et la fa�on de le cr�er peut rester le meme? Si je dois faire une manip sp�ciale, je ne sais pas laquelle il faudrait que je fasse ^^"

    Je vais tenter �a

  19. #19
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Par d�faut
    J'ai juste chang� l'endroit de cr�ation de thread par couper-coller, mais �a ne change rien, je n'ai tjrs pas de notification :/

Discussions similaires

  1. [MFC] Thread et timer
    Par r0d dans le forum MFC
    R�ponses: 2
    Dernier message: 18/04/2005, 13h03
  2. [MFC] Thread
    Par romeo9423 dans le forum MFC
    R�ponses: 2
    Dernier message: 25/03/2005, 14h20
  3. [MFC] DLL et notifications d'�v�nements
    Par Kaori dans le forum MFC
    R�ponses: 19
    Dernier message: 22/03/2005, 09h33
  4. [MFC] Thread & memory leaks
    Par Racailloux dans le forum MFC
    R�ponses: 7
    Dernier message: 15/03/2005, 12h44
  5. R�ponses: 3
    Dernier message: 11/02/2004, 12h50

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