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 :

Actualisation du contenu d'un contrôle


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut Probléme de détection de DCD avec classe CCom
    Bonjour à tous,

    J'ai un petit soucis sur une actualisation du contenu d'un contrôle que cela soit un CEdit ou un CStatic.

    Je récupère une donnée sur mon port COM puis je l'affiche dans un CEdit.

    Fonction qui récupère la donnée sur le port COM:

    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
     
    LONG CAppDlg::OnReceiveCom(WPARAM ch, LPARAM port)
    {
        char *szReceive;
        int nr;
        szReceive = new char [(nr=(m_Com.SizeUsedInRXBuf()+1))];
        memset(szReceive,0,nr);
        m_Com.ReadBuffer(szReceive,nr-1);
        CString str;
     
        str.Format("%s",szReceive);
        delete [] szReceive;
     
        m_dlg_Visu->SetData(str);
     
        return 0L;
    }
    Ma fonction SetData:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    bool CVisu::SetData(CString Data)
    {
         SetDlgItemText(IDC_EDT_DATA,Data.GetBuffer());
     
     
         return true;
    }
    Le truc c'est que ma data arrive en deux fois sur mon port ca veux dire que coup sur coup on passe dans la fonction OnReceiveCom(...), et donc que la fonction SetData est elle aussi appelée deux fois coup sur coup.

    j'arrive à afficher quelque chose si je met un temps d'arrêt (Sleep()) après SetData() dans la fonction OnReceiveCom(...)

    Quelqu'un pourrait il m'éclairer?

    Merci d'avance

  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
    salut,
    un peu vague pour moi.
    quel est le problème rafraichissement trop rapide ?
    une donnée reçue a une taille prédéterminée ?
    note ce que tu as ecris peut etre amélioré:
    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
    LONG CAppDlg::OnReceiveCom(WPARAM ch, LPARAM port)
    {
        char *szReceive;
        int nr;
        szReceive = new char [(nr=(m_Com.SizeUsedInRXBuf()+1))];
        memset(szReceive,0,nr);
        m_Com.ReadBuffer(szReceive,nr-1);
        
        m_dlg_Visu->SetData(szReceive);
        delete [] szReceive;
        
        return 0L;
    }
    bool CVisu::SetData(const char *szData)
    {
         SetDlgItemText(IDC_EDT_DATA,szData);
            
         return true;
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Salut Farscape,

    Le problème est que rien ne s'affiche, lorsque je met un Sleep() après ma fonction SetData() cela s'affiche sinon ca fait comme un clignotement et puis rien au final.

    Je vois bien que mon edit change de valeur(le clignotement) mais la valeur ne reste pas.

    En pas à pas cela s'affiche aussi donc je suppose que cela est du au temps d'actualisation,non?

    Merci encore

  4. #4
    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
    hé bien tout depend;
    si la deuxième réception est un blanc tu effaces tout d'où un effet de clignotement.
    il faudrait commencer par vérifier ce qui arrive en tant que flux.
    en trace debug par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool CVisu::SetData(const char *szData)
    {
         TRACE("\ndata:(%s)",szData);
         SetDlgItemText(IDC_EDT_DATA,szData);
            
         return true;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Alors voilà j'ai fait ce que tu ma conseillé de faire : TRACE
    en effet avec ça on voit que la deuxième fois c'est du blanc...!!!

    alors qu'avec des points d'arrêt dans la fonction OnReceiveCom(...) on voit que la deuxième fois ce n'est pas blanc mais qu'il y'a bien des données!
    De plus avec les points d'arrêt les données s'affichent bien dans mon CEdit.

    Je ne pige pas vraiment...

    Ne serait ce pas un problème de retour chariot ou quelque chose dans le genre??

    Merci encore

  6. #6
    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
    tout est une question de gestion de flux ,de bufferisation de la communication etc..
    a partir du moment ou tu mets des points d'arrêts dans le programme le flux de donnée n'arrivera pas forcement de la même manière.
    d'où ma question précédente: un message a t-il une taille donnée prédéfinie ou non ?
    si ce n'est pas le cas il sera difficile d'affecter le résultat d'une communication
    a un edit...
    ou alors il faut attendre que le buffer de com soit vide entièrement vide avant d'envoyer les infos à l'edit..

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Salut,

    Je reviens à la charge, pour ce qui est de la trame, j'ai fait un contrôle dessus pour pouvoir l'interpreter correctement!

    Maintenant mon problème c'est toujours ce DCD.

    Est ce bien dans la fonction OnEventCom(WPARAM ch, LPARAM port) que je vais savoir si il a changé d'état ou pas ???

    car j'ai fait de la façon suivante juste pour controler si je le détectait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    OnEventCom(WPARAM ch, LPARAM port)
    {            
                 AfxMessageBox("un evenement sur le port COM");
    	//Si changement d'etat du LSD
    	if(port == EV_RLSD)
    	{	
    		AfxMessageBox("Detection Du DCD");
    		 //Le DCD a été activé
    	}
     
    return 0L;
    }
    Alors est ce que j'ai fait une erreur ou pas car la je ne détecte rien du tout?

    J'ai sans doute mal compris quelque chose!!

    Merci d'avance

  8. #8
    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
    le message est implémenté dans la macro BEGIN_MESSAGE_MAP ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Salut,

    oui de la façon suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_MESSAGE(WM_CCOMEVENT,OnEventCom)

  10. #10
    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
    si tu as déclaré correctement setcommask.
    il ne reste pas 36 solutions :
    soit l'évènement windows n'est pas le bon ,bien que ça ait quand même l'air de correspondre.
    soit ton câble n'est pas câblé pour le DCD pin: 1 si je me souviens bien pour un connecteur 9 broches.
    soit l'évènement n'est pas fourni...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    OK je vais me renseigner j'ai trouvé un utilitaire sur le net pour voir l'état de toutes les pinouilles... je vais essayer pour voir si le DCD arrive bien .

    Merci encore Farscape

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

Discussions similaires

  1. Comment faire popur actualiser le contenu d'un div?
    Par Ministar dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/09/2007, 23h46
  2. Réponses: 1
    Dernier message: 16/08/2007, 09h43
  3. [WD10] [zone repetee] Actualiser le contenu
    Par Root_JDK dans le forum WinDev
    Réponses: 5
    Dernier message: 01/05/2007, 17h34
  4. Comment actualiser le contenu d'un répertoire
    Par nbelg27 dans le forum Access
    Réponses: 9
    Dernier message: 28/04/2006, 10h22
  5. actualiser le contenu d'une div
    Par Benjiijneb dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 08/02/2006, 10h17

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