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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

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

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

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    tu as bien fait le accept de la socket cliente a partir de la socket principale d'attente ?

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    pourquoi je ne vois pas la creation de l'objet incomingSock dans ton code ?

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 77
    Points : 46
    Points
    46
    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