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. #21
    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
    Tout est directement mis dans le main (je suis très débutant), mais si je met une message box tout en haut de mon main, il me l'ouvre. J'ai donc descendu la message box de ligne en ligne pour voir ou ça coinçait : il s'avère qu'au moment ou je configure mon COM c'est a dire :

    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
        int nId;
     
    nId=3;
    /* variables locales */
        char szCOM[16];
     
        /* construction du nom du port, tentative d'ouverture */
        sprintf(szCOM, "COM%d", nId);
        g_hCOM = CreateFile(szCOM, GENERIC_READ|GENERIC_WRITE, 0, NULL,
                            OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
     
        /* affectation taille des tampons d'émission et de réception */
        SetupComm(g_hCOM, RX_SIZE, TX_SIZE);
     
        /* configuration du port COM */
        if(!SetCommTimeouts(g_hCOM, &g_cto) || !SetCommState(g_hCOM, &g_dcb))
        {
            AfxMessageBox("COM problem : Le programme ne fonctionnera pas correctement.", MB_ICONSTOP);
    		UpdateData(TRUE);
     
            CloseHandle(g_hCOM);
            return FALSE;
        }
     
        /* on vide les tampons d'émission et de réception, mise à 1 DTR */
        PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
        EscapeCommFunction(g_hCOM, SETDTR);
        return TRUE;
     
    UpdateData(FALSE);
     CloseCOM();
    Si je place une message box au dessus du if de configuration, la message box apparait, si je le place en dessous, elle n'apparait plus.
    Je me suis dit, "je suis sur un portable, j'ai pas de port COM, ça doit bugguer à cause de ça." Je mets donc une petite ligne dans le if qui me dit si c'est bien ça le problème. Bingo, c'est ça. Je file sur un pc avec le bon port COM (le 3), et le message dans le if n'apparait plus (normal). Mais la message box juste derrière n'apparait pas non plus.

    Tu as une idée de pourquoi ce if bloque les messages box?

  2. #22
    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, j'ai le message "si ça ne s'affiche pas, c'est qu'on rentre pas dans la boucle", par contre il reste dans la boucle sans en sortir parce qu'il ne m'affiche plus ma fenêtre...

    Comment je peux faire tourner ma boucle tout en ouvrant ma fenêtre?

  3. #23
    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
    En fait, il affiche le message et quand je règle l'heure de mon horloge sur l'heure de fermeture (initiale (00h00)), il m'envoie toutes les 30 secondes le message et fermeture de l'electrovanne).

    Me reste plus qu'a ouvrir la fenêtre en même temps.

  4. #24
    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
    ca se complique la..

    Si tu fais une boucle infinie while(true),
    par definition, tu ne sortiras jamais de la boucle.. donc cest logique que toutes les 30 secondes ca t affiche un message etant donné qu'il refait le test toutes les 30 secondes...

    A mon avis, il faut que tu revois la conception de ton projet.

    Ou alors tu utilises un thread pour gerer ta boucle infinie mais c est peu etre un peu trop compliqué.
    Pour info au cas ou:
    http://www.boost.org/doc/libs/1_35_0...ml/thread.html
    http://matthieu-brucher.developpez.c.../boost/thread/
    http://www.ddj.com/cpp/184401518
    http://www.ddj.com/cpp/184401518?pgno=2
    pour le dernier lien, tu remplaces la fonction hello par ta fonction qui boucle et ca devrait pas trop mal marcher.
    Par contre il faut que tu configures boost tout ca tout ca... c'est assez compliqué qd on débute.

  5. #25
    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
    En fait c'est bon, il ne m'envoie le message qu'une seule fois étant donné que 30 secondes après le premier message, on a changé d'heure (de minutes en fait mais tu m'as compris) et il n'a donc plus aucune raison de me ré-envoyer un autre message, l'électrovanne s'est donc fermée, point.

    Le seul truc c'est ce fameux thread parce que partout ou je cherche comment gérer ma boucle infinie, ce mot revient. Je vais essayer de voir ce que c'est avec les liens que tu m'as donné.
    On verra bien si j'y arrive, de toute façon, j'ai pas le choix, je peux pas abandonner.

    Bon bah je me souhaite bonne lecture et à très bientôt.

  6. #26
    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
    Héhé, ça fait 1/4 d'heure que je lis et je suis perdu dès qu'on dépasse l'introduction et je te parle pas des trucs en anglais...
    Bon déjà, j'ai compris qu'il me fallait boost/thread/thread.hpp et ça, j'ai aucune idée de ou je vais le trouver, si tu sais, tu pourrais me dire?

    Ensuite, je vais tester le dernier lien que tu m'as filé en remplaçant comme tu m'as dis la fonction hello par la mienne.
    Qui ne tente rien n'a rien comme on dit. Je reposterais quand j'aurais trouver cette bibliothèque et fait le test.

    A très bientôt.

  7. #27
    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
    ouais enfin boost faut l installer avant.

    L installation depend sur quel os et quel compilo tu as.
    Je suppose que tu es sur windows avc visual studio.
    Auquel cas, tu dl ca: http://www.boost-consulting.com/boost_1_34_1_setup.exe

    puis tu suis ce tuto:
    http://arb.developpez.com/c++/boost/install/vc++/

    enfin maintenant je vais te laisser gerer comme un grand le reste pq tout ca c'est juste de la recherche google et tu as tous les liens pour bien comprendre.

  8. #28
    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, j'ai installé ce truc et j'ai bien tout suivi à la lettre seulement voilà, j'ai une erreur quand je mets le include la bibliothèque comme sur le 4ème lien que tu m'as donné. Pas d'erreur à la compilation mais quand je build :
    LINK : fatal error LNK1104: cannot open file "libboost_thread-vc6-mt-1_34_1.lib" bon évidemment je sais pas comment régler le problème ni même de quel fichier il parle. J'arrête pour aujourd'hui, si quelqu'un sait pourquoi j'ai cette erreur, qu'il n'hésite pas.

    escafr, le seul moyen pour faire 2 trucs en parrallèle c'est le thread, y a rien d'autre ?

    Au fait, merci pour ton aide, je te l'ai pas dit mais j'aurais mis je sais pas combien de temps déjà pour comprendre tout ce que tu m'as dit, peut être aurait on du compter en semaines je sais pas. En tout cas merci beaucoup, à +

  9. #29
    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
    Citation Envoyé par Taurnil Voir le message
    Bon, j'ai installé ce truc et j'ai bien tout suivi à la lettre seulement voilà, j'ai une erreur quand je mets le include la bibliothèque comme sur le 4ème lien que tu m'as donné. Pas d'erreur à la compilation mais quand je build :
    LINK : fatal error LNK1104: cannot open file "libboost_thread-vc6-mt-1_34_1.lib" bon évidemment je sais pas comment régler le problème ni même de quel fichier il parle. J'arrête pour aujourd'hui, si quelqu'un sait pourquoi j'ai cette erreur, qu'il n'hésite pas.
    tu as du oublier de rajouter le chemin vers les libs boost.
    Puis répétez l'opération avec le répertoire C:\Program Files\boost\boost_1_34_1\lib au niveau de la liste des Fichiers bibliothèques
    dans le tuto
    http://arb.developpez.com/c++/boost/install/vc++/ dans la partie Configuration de Visual C++ 2005 pour utiliser Boost et Boost.TR1

    escafr, le seul moyen pour faire 2 trucs en parrallèle c'est le thread, y a rien d'autre ?
    Que je connaisse oui.

    Au fait, merci pour ton aide, je te l'ai pas dit mais j'aurais mis je sais pas combien de temps déjà pour comprendre tout ce que tu m'as dit, peut être aurait on du compter en semaines je sais pas. En tout cas merci beaucoup, à +
    ba de rien, on est tous passé par la.

  10. #30
    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, j'ai compris l'erreur, en fait j'avais bien entré le truc dans tools-options-library files, le problème vient d'ailleurs, en fait il n'y a pas ce qu'il me demande dans ce fichier.

    Moi, je travaille avec vc++ 6.0, et dans ce dossier y a plein de trucs pour vc++ 7.1 ou 8.0.

    Donc, faut que je trouve le même truc pour la version 6 et l'ajouter au dossier...

    Allez, au boulot

  11. #31
    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
    tu vas devoir installer boost a partir des sources directement.
    c'est pas trop compliqué, il y a pas mal de doc sur le net.
    Par contre ca risque d'etre assez long (compte 2-3h de compilation), donc j'espere que le café est gratuit ou tu travailles

  12. #32
    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
    Tu pourrais me dire comment je fais?
    Ou un lien ou télecharger les sources?

    Après je dois faire quoi ouvrir les sources avec Visual et compiler?

    2-3h, fais chier enfin bon j'ai pas vraiment le choix. Au fait, j'ai besoin de garder l'install d'avant (ça fait quand même 800Mo)?

    Merci pour tes réponses

    PS : Il est gratuit mais j'aime pas le café...

  13. #33
    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
    désolé mais là je vais te laisser chercher tout seul

    Si tu veux apprendre a programmer va falloir apprendre a chercher sur le net et te debrouiller tout seul. Dis toi que je te rend service comme ca.
    En plus tu as plein d'info deja avc tous les liens que je t'ai donné.

    Amuse toi bien.

  14. #34
    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
    Arrête, tu peux pas me faire ça...

    Bon ok , moi j'arrête. Bah, j'ai commencé à chercher mais je sens que je vais en avoir pour un moment...

    Allez merci pour toute l'aide que tu m'as donné. Je reposterais dès qu'il y aura du nouveau ou dès qu'il y a un nouveau truc qui marche.

    ++ et à un de ces 4.

  15. #35
    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,
    je n'ai pas tout lu (les 3 pages de post)
    mais il y a un post dans la faq sur la gestion du port série:
    http://cpp.developpez.com/faq/vc/ind...WithSerialPort

  16. #36
    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
    Salut farscape, en fait le problème n'est plus vraiment au niveau du port série (ça, ça marche très bien maintenant).

    Bon, je vais pas recopier les 3 pages de discussion mais je t'explique en gros le problème :

    Un utilisateur peut entrer à travers une fenêtre une heure (dans une edit box mais je crois savoir que c'est un peu ton truc les MFC) que je dois ensuite comparer à l'heure actuelle.

    Seulement voilà la fonction que j'utilise pour comparer les 2 heures (entrées et actuelles) :

    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
    while (true) {
            curTime = CTime::GetCurrentTime();
            heure = curTime.GetHour(); //séparation heures-minutes
            minute = curTime.GetMinute();
     
            if (heure == m_heurefermeture && minute == m_minutefermeture) {            
           PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
        EscapeCommFunction(g_hCOM, SETDTR);
            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);
            }
    		m_heure = heure;		//affichage pour test			
    		m_minute = minute;
    		UpdateData(FALSE);
            Sleep(30000);}
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    Et la, tu as vu le problème, le programme attend que cette boucle soit terminée avant d'ouvrir la fenêtre, et c'est là que ça coince. Faut que je trouve le moyen de garder la fenêtre ouverte ET de continuer à boucler pour tester l'heure.

    escafr m'a filé plein d'idées mais c'est encore un peu compliqué pour moi. (si tu lis les autres posts, tu pourras constater que je suis pas vraiment très bon)

    Mais enfin bon, la vocation de gars comme toi,c'est aussi d'aider ceux qui débutent..................... non?

    En tout cas merci beaucoup d'avance pour toutes tes futures réponses.

    A très bientôt (j'espère)

  17. #37
    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 tester quelque petites choses : la fenêtre ne s'ouvre toujours pas (ça serait trop beau) mais TOUT le reste du programme a l'air de fonctionner, si tant est qu'on rentre les heures d'ouverture et de fermeture directement dans le code.

    En effet, si j'initialise (par exemple) heure d'ouverture à 10h10 et heure de fermeture à 10h11, et bien mon électrovanne s'ouvre bien à 10h10 pour se fermer à 10h11.

    Il me manque plus que ma fenêtre pour pouvoir entrer les heures sans passer par la source......

    De grâce..... J'y suis presque.

    Merci d'avance.

  18. #38
    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,
    les boucles de traitement empêchent les messages windows d'arriver aux fenêtres ou aux contrôles, l'interface est alors gelée.
    pour éviter cela il faut appeler une pompe a messages dans la boucle ou faire un thread utilisateur pour lancer le traitement.
    celui-ci pouvant envoyer un message privé a l'interface quand son traitement est terminé.
    voir faq vc:
    pompe a messages :http://cpp.developpez.com/faq/vc/ind...rk#PumpMessage
    thread utilisateur :
    http://cpp.developpez.com/faq/vc/?pa...keWorkerThread

  19. #39
    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
    Merci beaucoup farscape pour la lecture que tu viens de me donner ^^

    ok, bah très bien, je vais voir avec les pompes à messages si j'y arrive mieux qu'avec les threads.

    Je vous tiens au courant. ++

  20. #40
    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 jeter un coup d'œil à la première rubrique du 2ème lien que tu m'as donné (Comment faire pour que dans une boucle de traitement l'application ne semble pas figée ?). Ça a l'air d'être exactement ce qu'il me faut donc j'essaie tout de suite et voilà ce que je met dans ma 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
    /*static */void CFenetre1Dlg ::PumpMessages() 
    { 
       // 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 
        } 
    }
    Je crois à peu de chose près un copier coller de la fonction qu'il y a dans le tuto que tu as fait.

    A la compilation, j'ai les erreurs suivantes :

    C:\Program Files\Microsoft Visual Studio\MyProjects\Fenetre 1\Fenetre 1Dlg.cpp(256) : error C2039: 'PumpMessages' : is not a member of 'CFenetre1Dlg'
    C:\Program Files\Microsoft Visual Studio\MyProjects\Fenetre 1\Fenetre 1Dlg.h(14) : see declaration of 'CFenetre1Dlg'
    C:\Program Files\Microsoft Visual Studio\MyProjects\Fenetre 1\Fenetre 1Dlg.cpp(257) : error C2601: 'PumpMessages' : local function definitions are illegal
    Je me dit, peut être existe t'il un truc genre "PumpMessages.h" à inclure?

    Je vais voir vite fait en ligne et je trouve des bouts de programme qui incluent cette lib. Bon, j'essaie d'ajouter la ligne mais évidemment il me dit qu'il trouve pas le fichier "PumpMessages.h".

    Est-ce que ça va vraiment résoudre les erreurs si j'ajoute PumpMessages.h?
    Et où peut-on trouver cette bibliothèque?

    Merci d'avance pour vos réponses.

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