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 :

réception série et maj de l'interface utilisateur


Sujet :

MFC

  1. #41
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    C'est bon je viens de mettre directement le code de la fonction dans la boucle de la manière suivante :

    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
    while (true) {
            curTime = CTime::GetCurrentTime();
            heure = curTime.GetHour(); //séparation heures-minutes
            minute = curTime.GetMinute();
     
            if (heure == m_heurefermeture && minute == m_minutefermeture) {            
           EscapeCommFunction(g_hCOM, CLRDTR);
     PurgeComm(g_hCOM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); 
            UpdateData(TRUE);
     
            } else if (heure == m_heureouverture && minute == m_minuteouverture) {
                PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
        EscapeCommFunction(g_hCOM, SETDTR);
    	UpdateData(TRUE);
            }
     
     
     
       // Handle dialog messages 
        MSG msg; 
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        { 
            if (!AfxGetApp()->PreTranslateMessage(&msg)) 
          { 
             ::TranslateMessage(&msg); 
             ::DispatchMessage(&msg); 
         }            
         AfxGetApp()->OnIdle(0);   // updates user interface 
        AfxGetApp()->OnIdle(1);   // frees temporary objects 
        } 
     
     
    		m_heure = heure;		//affichage pour test			
    		m_minute = minute;
    		UpdateData(FALSE);
            Sleep(30000);}
    Bon, déjà, il compile, build et exécute sans broncher. Maintenant, ma fenêtre ne s'ouvre toujours pas au début du programme et je vois absolument pas pourquoi....

    Où est mon erreur ?

  2. #42
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Par défaut
    Au risque de paraitre désagréable, mais si au lieu de prendre des bouts de codes dans tous les sens, de les assembler comme des legos et esperer que ca marche, tu prenais le temps de réfléchir et comprendre ce que chacun apporte, peut être poserais tu moins de questions sur ce forum et avancerais plus vite....

    créé une boucle infinie.. qui par définition.. n'a pas de fin..
    Problème que l'on t'a déjà signalé...

  3. #43
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Le risque était fondé...

    Pourquoi tu me parles de boucle infinie, j'ai fait comme m'a dit farscape, appeler un pompe à messages dans ma boucle, ça devrait "théoriquement" permettre à mon programme d'ouvrir ma fenêtre. Et là, ma fenêtre ne s'ouvre pas, je voudrais bien savoir pourquoi, c'est tout.

    Merci d'avance

    PS : T'énerves pas, j'veux juste que ça avance, si j'étais capable tout seul, crois moi ça serait fini. Parce que j'en passe, du temps . . .

  4. #44
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    J'ai testé le thread comme j'y arrivais pas avec la fonction Pumpmessages.

    Voilà, je fais comme dans la FAQ et il me trouve une erreur :
    error C2373: 'AfxBeginThread' : redefinition; different type modifiers
    Cette erreur vient de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
    dans la première partie du code de l'utilisation de afxBeginThread.

    Quelqu'un peut me dire ce qu'il se passe? Et pour les pompes à messages, quelqu'un a vu le dernier post?

    Merci d'avance.

    PS : crie pas s'il te plait escafr, j'ai une otite.

  5. #45
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    désolé de poster 2 fois d'affilée mais là, j'avance plus...
    Pour les pompes à messages et le thread de travail à utiliser, si quelqu'un pouvait me mettre sur la voie, merci à lui de se manifester .

    Voila, en attendant vos réponses qui, je l'espère seront nombreuses , une bonne journée à tous.

  6. #46
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Bon, bah c'est encore moi, je sais pas si j'aurais des réponses mais bon je dis quand même quand j'avance.

    J'ai utilisé un tuto sur les threads pas mal fait qui me fait utiliser la bibliothèque pthreads. J'ai aucun problème, ma fenêtre s'ouvre et ma boucle tourne en même temps. C'est super bien expliqué mais j'arrive sur une erreur à la compilation :

    error C2065: 'UpdateData' : undeclared identifier
    L'erreur se produit seulement quand j'appelle UpdateData(FALSE) ou (TRUE) dans mon thread, il n'y a aucun problème si j'appelle ça dans le main.

    Voilà, si quelqu'un pouvait m'aider, ça serait très gentil à lui.

    A bientôt.

  7. #47
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 408
    Par défaut
    UpdateData, pour moi, c'est du code pour MFC...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #48
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Par défaut
    comme ton compilateur te l indique il ne reconnait pas la fonction UpdateData..

    Il faut que la fonction qui l'appelle soit une fonction membre de la form MFC de laquelle tu veux recuperer les variables.

  9. #49
    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
    bon je (re)mets mon grain de sel,
    ta manière de procéder ne peut que conduire a l'échec tu fais un mélange de bric et de broc : tu traites la réception série, la mise a jour de l'interface sans distinction de traitement .
    je t'ai indiqué un lien d'une classe pour travailler avec le port série ce n'est pas pour rien, tout y est :
    le travaille avec un thread ,la gestion correcte de la communication série, le lien avec l'interface utilisateur.
    détail du traitement:
    -la logique de réception est dans un thread de travail ,
    -quand on reçoit une notification de réception de caractères le thread envoie un message privé à l'interface de de traitement (la boite de dialogue dans ton cas).
    - on peut alors lire le contenu du port série.
    - si il n'y a rien a lire le thread est en attente.
    j'ai donc un objet de réception série couplé avec une interface utilisateur je ne mélange pas tout et surtout je ne gèle pas l'interface si il n'y a rien a recevoir...

  10. #50
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Ok, bah merci beaucoup, je vais regarder ça et je redirais si j'y suis arrivé.
    Au fait , c'est bien du code pour MFC, mais mon programme est en MFC.

    A bientôt et encore merci à tous.

  11. #51
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Bon, je viens de regarder la FAQ sur la gestion du port série mais je veux juste mettre à 1 mon fil DTR. Dans mon programme à l'état actuel, ça fait 2 lignes pour ouvrir le port, 2 pour le fermer, et 2 pour mettre à 1 DTR. J'ai vraiment besoin de tout ce que tu m'as montré?

    Si oui alors faut me dire quels points de la source il faut que je comprenne parce que j'ai un peu (beaucoup) de mal avec le code que tu as mis juste en dessous des explications.

    Merci beaucoup à vous.

  12. #52
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Lol, je crois que je viens de comprendre un truc. En fait, je pensais que le bout de code énorme était à placer dans mon code mais en fait non.

    Comment je fais alors pour me servir de ça stp?



    PS : Désolé d'être mauvais comme ça, pourtant je bosse mais c'est pas facile...

  13. #53
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    La, j'ai retouché un peu le code et j'ai toujours cette erreur "UpdataData, undeclared identifier"

    Je voudrais savoir pourquoi j'ai cette erreur, je remets le code de la boucle :

    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
     
    void* boucle(void*)
    {
    	while (true) {
    int	heure,m_heurefermeture,minute,m_minutefermeture,m_heureouverture,m_minuteouverture,m_heure,m_minute;
     
    AfxMessageBox("mise a jour 30 secondes",NULL);
            	CTime curTime = CTime::GetCurrentTime();
            heure = curTime.GetHour(); //séparation heures-minutes
            minute = curTime.GetMinute();
     
            if (heure == m_heurefermeture && minute == m_minutefermeture) {            
           EscapeCommFunction(g_hCOM, CLRDTR);
     PurgeComm(g_hCOM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); 
      AfxMessageBox("fermeture électrovanne", MB_ICONSTOP);       
     
     
            } else if (heure == m_heureouverture && minute == m_minuteouverture) {
                PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
        EscapeCommFunction(g_hCOM, SETDTR);
    	 AfxMessageBox("ouverture électrovanne", MB_ICONSTOP);       
    UpdateData(TRUE);
            }
     
     
    m_heure = heure;		//affichage pour test			
    		m_minute = minute;
    Sleep(30000);
    	}
     
    }
    Je comprend pas pourquoi ici j'ai cette erreur alors que j'appelle plein de fois UpdateData pour des boutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void CFenetre1Dlg::Onbasfermeturemin() 
    {m_minutefermeture=m_minutefermeture-10;
     
    if (m_minutefermeture<0)
    {m_minutefermeture=50;}
     
    	// TODO: Add your control notification handler code here
    		UpdateData(FALSE);
    }
    La, je sais pas du tout quoi faire, la MSDN ne m'est d'aucune aide puisque l'erreur fait habituellement référence a des variables non déclarées.


    Il faut que quelqu'un m'aide... Merci beaucoup à celui qui saura m'aider.

    PS : Désolé de faire du forcing.

  14. #54
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    UpdateData() est une méthode de la classe CDialog
    Normal que tu ne peux pas y accéder depuis ta fonction boucle()...
    Il faut que tu aies un pointeur sur ta classe dérivée de CDialog ou alors tu mets ta fonction boucle() comme membre de cette classe...

    @+

  15. #55
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Ca faisait un moment que j'attendais quelqu'un qui allait essayer de me donner une solution plutôt que de me dire de recommencer.

    Tout d'abord merci à toi, par contre j'ai pas bien saisi ce que tu as dit (et oui, je suis pas bon du tout), tu pourrais m'expliquer.

    La classe dérivée de CDialog pour moi c'est CFenetre1Dlg, comment on fait pour que ma fonction boucle soit membre de ça?

    Merci d'avance pour tes réponses.

  16. #56
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    La classe dérivée de CDialog pour moi c'est CFenetre1Dlg, comment on fait pour que ma fonction boucle soit membre de ça?
    là ce que tu me demandes c'est les bases du C++

    Ca faisait un moment que j'attendais quelqu'un qui allait essayer de me donner une solution plutôt que de me dire de recommencer.
    vu le nombre de posts de ce thread (sans avoir tout lu), je crois qu'ils sont tous fatigué de répondre à des questions de base alors qu'ils t'ont tous orientés vers des bons tutos / exemples pour débuter ... tu brules un peu les étapes et tu poses des questions qui ont leurs réponses dans les tutos

    avant de t'attaquer aux MFC, maitrise déjà bien le C++, sinon c'est peine perdue.

    c'est pas de la mauvaise volonté pour t'aider, mais là dans ce cas, pour t'aider c'est faire tout le projet à ta place

    fais sous-traiter ou alors commence depuis le debut (cours C++ ...) sans bruler les etapes

    @+

  17. #57
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Ah raté, bon tant pis, je vais chercher tout seul alors.

    Bah, j'te dis merci quand même hein, ça mange pas de pain comme on dit.

    Juste une chose, si je trouve comment on ajoute boucle à la classe dérivée de CDialog, tu penses que ça va marcher?

  18. #58
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Juste une chose, si je trouve comment on ajoute boucle à la classe dérivée de CDialog, tu penses que ça va marcher?
    non, aucune chance

    c'est quoi ta fonction boucle() ? un nouveau thread ? tu en sors comment de ta boucle ? si tu mets ça dans le thread principal tu bloques tout ...

    petit conseil qui ne mange pas de pain aussi

    tu créées un timer (fonction SetTimer(), KillTimer() de ta boite de dialogue, à initialiser dans OnInitDialog() ) qui bats à la seconde. Dans un évènement OnTimer() tu vérifies ton heure de fermeture / ouverture et tu agis en conséquence, puis tu rends la main sans faire aucune boucle...

    en faisant une boucle, tu empeches ton appli de respirer et de gérer les messages d'évènements ... la boucle à messages

    @+

  19. #59
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Par défaut
    Ma fenêtre est pas gelée, la boucle est dans un thread de travail et la fenêtre se fait en parallèle, la boucle s'arrêtant uniquement quand on ferme la fenêtre (ça, c'est dans le cahier des charges, j'y peux rien). Je vois boucler (la ligne avec la messagebox) et j'arrive à agir sur mes boutons pour régler l'heure en même temsp que ça boucle, le problème étant que le programme ne mets pas à jour les variables associées aux edit box.
    De ce côté la je trouve ça normal car j'ai toujours lu qu'on utilisait UpdateData pour rafraichir les variables, et là je peux pas l'utiliser.

    Pour les timers, j'ai essayé mais j'y arrive pas. Je sais que ça me permettrait d'éviter le thread mais bon maintenant que je l'ai fait ce thread de travail...

    PS : Je sais que l'utilisation des timers est pas compliquée (pour vous j'entends) mais ça me gène de tout refaire alors que j'ai déjà mis du temps à faire ce #@#!! de thread de travail.

  20. #60
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Ma fenêtre est pas gelée, la boucle est dans un thread de travail et la fenêtre se fait en parallèle, la boucle s'arrêtant uniquement quand on ferme la fenêtre
    faux, quand le processus s'arrete et non la fenetre fermée ... (peut etre que la fenetre fermée induit l'arret du processus ... )

    quand tu fais ton AfxBeginThread() tu donnes l'adresse de ta boite de dialogue en paramètre (2ème paramètre de la fonction)

    dans ta boucle:

    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
     
    UINT boucle(void *pParam)
    {
    CFenetre1Dlg *pDlg=(CFenetre1Dlg*)pParam;
     
    ...
     
    if (heure == pDlg->m_heurefermeture && minute == pDlg->m_minutefermeture)
    {
      ...
    }
     
    ...
     
    pDlg->UpdateData(TRUE);
     
    ...
     
    }
    en effet le timer aurait été bcp plus facile et moins gourmand en ressource ...

    bonne chance

    @+

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/10/2003, 16h32
  2. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27

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