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 :

Question sur les objets


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Question sur les objets
    Bonjour,
    Je suis nouveau sur le forum, je connais ce site depuis un petit temps...
    Je voudrais concevoir un programme MFC sous Visual Studio 2005.
    Ce programme sera un serveur qui listera dans un CListCtrl les clients.

    Pour se faire, j'ai mit un bouton qui lance l'objet serveur par une bête fonction qui lance une fonction thread qui guette les connexions et qui crée un nouveau thread par client...

    Jusque là tout fonctionne bien, mais j'aimerais que quand un client se connecte, un message sincère dans cette liste...

    Quand je suis dans mon objet principale j'utilise ces trois lignes que j'ai trouvé sur je ne sais plus qu'elle site...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int ind = m_list.InsertItem(0,_T("Tosqualler"));
    m_list.SetItem(ind,1,LVIF_TEXT, "127.0.0.1",0,0,0,0);
    m_list.SetItem(ind,2,LVIF_TEXT, "10",0,0,0,0);
    ou m_list est un objet CListCtrl;
    Donc je cherche à accéder à cet objet déclaré dans un autre objet par mon objet serveur. ( Comment passer l'objet? )
    J'ai eu beau chercher et lire mon livre sur le C++, je ne trouve pas ce que je veux, ou je ne le vois pas :s
    Je crois que c'est une histoire de pointeurs ou de références...
    Je ne demande pas nécessairement une réponse toutes faites tout jolie mais une piste, ou des mots clés pour parvenir à pouvoir apprendre et continuer à avancer dans mon petit programme...

    Merci beaucoup

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par tosqualler Voir le message
    un message sincère dans cette liste...



    Bon, déjà je te conseille de ne pas exposer ton listctrl. Autrement dit, les client ne doivent pas pouvoir accéder à lui directement. En effet si tu choisis de remplacer ce controle par un autre, tu va te retrouver à devoir changer le code de ton client en plus du code du serveur.

    A la place, tu créé une fonction public du serveur NouveauClient( Client const & ) et dans cette fonction tu fais list.InsertItem( 0, client.GetNom() );

    Au fait tu sais que tu t'es complètement trompé de sous-forum ? Ici c'est la section STL. Il y a un forum spécial MFC.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Je vois que le correcteur orthographique de Google m'a fait faire une belle faute xD et laissera un beau petit bide sur ce forum :p
    Je n'avais pas vu le sous-forum MFC :-( j'ai mit STL car ça concerne surtout les objets et mon livre c++ ne parle que de ça, si un admin/modo passe, il pourrait déplacer mon post svp?

    Je sais pas si ça va résoudre mon problème :s, je n'ai pas encore commencé à faire mon client propre...

    Mais je voudrais que mon objet serveur, accède à l'objet m_list de mon objet principale ainsi quand serveur créera un thread pour un client, il affiche le nom de la machine distante, l'ip et le ping...

    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
    Dans MonObjetPrincipalDlg.h
    ...
    public:
    	CListCtrl m_list;
    ...
    
    
    
    Dans MonObjetPrincipalDlg.cpp
    ...
    void MonObjetPrincipalDlg::OnInitDialog()
    {
    ...
    	//Ajoute les 3colones
    	m_list.InsertColumn(0, _T("Nom Pc"), LVCFMT_LEFT, 125, 0);
    	m_list.InsertColumn(1, _T("IP"), LVCFMT_LEFT, 80, 0);
    	m_list.InsertColumn(2, _T("Ping"), LVCFMT_LEFT, 39, 0);
    
    	m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
    
    	//Ajoute dans la liste ( exemple) 
    	int ind = m_list.InsertItem(0,_T("Tosqualler"));
    	m_list.SetItem(ind,1,LVIF_TEXT, "127.0.0.1",0,0,0,0);
    	m_list.SetItem(ind,2,LVIF_TEXT, "10",0,0,0,0);
    ...
    }
    ...
    
    
    Dans Serveur.cpp
    UINT TServeur::ThreadClient(LPVOID sock) // Gère les clients
    {
    ...
    	//Ce que j'aimerais faire mais evidement m_list undeclared identifier, logique :s
    	int ind = m_list->InsertItem(0,_T("Tosqualler"));
    	m_list->SetItem(ind,1,LVIF_TEXT, "127.0.0.1",0,0,0,0);
    	m_list->SetItem(ind,2,LVIF_TEXT, "10",0,0,0,0);
    ...
    }
    Je sais que ça doit être tout con "d'envoyé" ce m_list dans ce thread mais je vois pas, quoi chercher? pointeur? référence? comment?

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par tosqualler Voir le message
    int ind = m_list->InsertItem(0,_T("Tosqualler"));
    m_list->SetItem(ind,1,LVIF_TEXT, "127.0.0.1",0,0,0,0);
    m_list->SetItem(ind,2,LVIF_TEXT, "10",0,0,0,0);
    C'est justement ça qu'il faut éviter. A partir du moment ou tu mets m_list dans ObjetPrincipal, lui seul devrait pouvoir y accéder.

    Comme je te l'ai dit, fais plutôt une fonction NouveauClient() dans ObjetPrincipal et c'est à elle d'executer ces trois lignes.

    La vraie question est : comment accéder à la bonne instance de ObjetPrincipal?

    Tu peux utiliser un Design Pattern Singleton si il n'y a qu'une seule instance d'ObjetPrincipal durant toute la durée du programme. Dans ce cas penses bien que tu y accède depuis des threads donc tu dois prévoir un système de Lock (Section critique sous windows).

    Deuxième solution : tu peux poster un message dans la boucle du thread principal et te débrouiller pour le recevoir et le traiter dans ObjetPrincipal.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Je vais regarder à ça j'ai réexpliquer parce que j'ai cru que je m'étais mal exprimé :p

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 366
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 366
    Points : 20 402
    Points
    20 402
    Par défaut
    Citation Envoyé par tosqualler Voir le message
    Donc je cherche à accéder à cet objet déclaré dans un autre objet par mon objet serveur. ( Comment passer l'objet? )
    Tout simplement en passant un pointeur ou une référence du CListCTrl.
    Plutot que de passer par la variable membre m_list il faut appeler GetDlgItem par exemple qui retourne un pointeur de CListCtrl; après il faut le passer à la fonction.

    Dans Serveur.cpp
    UINT TServeur::ThreadClient(LPVOID sock) // Gère les clients
    {
    ...
    //Ce que j'aimerais faire mais evidement m_list undeclared identifier, logique :s
    int ind = m_list->InsertItem(0,_T("Tosqualler"));
    ...
    }
    Eh bien sock est le paramètre passé à ThreadClient il faut lui passer un CListrCtrl * et caster après.
    Si par exemple l'ID du CListCTrl est IDC_LIST1 il suffit d'appeler
    CListCtrl *pListCtrl=(CListCtrl*)GetDlgItem(IDC_LIST1) et passer en paramètre à ServeurCLient

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 366
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 366
    Points : 20 402
    Points
    20 402
    Par défaut
    Tu peux créer une structure ThreadParam et passer les paramètres requis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct tagTHREADPARMS {
        int nValeur;
        HWND hWnd;
    } THREADPARMS
     
    .........
    THREADPARMS* ptp = new THREADPARMS;
    ptp->nValeur= 10;
    ptp->hWnd = m_hWnd;
    AfxBeginThread (ThreadFunc, ptp);
    Mais c'est vrai il faut dissocier les controles de préférences des autres fonctions comme le dit NiamorH

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    J'ai supprimé mon objet et j'ai mit mes fonctions dans l'objet principale et ça marche niquel
    Pour le ThreadParam, j'avais essayé après l'avoir vu sur le tuto des serveurs multithread de ce site mais j'y suis pas arriver à le faire xD ( le ThreadParam ).
    Je vais garder vos solutions bien au chaud
    Merci beaucoup à vous et au zentil admin/modo qui à déplacé mon post au bonne endroit

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Il est possible cependant que tu rencontres des problèmes en inter-agissant depuis les threads secondaires sur l'interface. A priori, la solution la plus sûre serait de passer par les messages des threads Windows avec des fonctions comme PostMessage ou SendMessage je ne rappelle plus très bien.

    J'avais été forcé de passer par là, à un moment. Si tu rencontres des problèmes que tu n'expliques pas, pense que ça peux venir de là.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur les objets
    Par Raikyn dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/10/2012, 10h56
  2. Une question sur les objets en VBA
    Par deubelte dans le forum Général VBA
    Réponses: 5
    Dernier message: 12/10/2007, 17h07
  3. question sur les objets
    Par afrikha dans le forum Langage
    Réponses: 14
    Dernier message: 07/12/2005, 15h21
  4. Réponses: 5
    Dernier message: 24/04/2005, 04h09
  5. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51

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