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] Boucle sur un bouton


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut [MFC] Boucle sur un bouton
    Bonjour à tous,

    j'ai défini un bouton. Lorsque l'on clique dessus, cela lance en boucle la lecture d'un capteur de pression et un capteur de température.

    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
     
    void CDlgMessung::OnLivetp() 
    {
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
     
    	while(stoploop == false)
    	{
     
    	DWORD dwStart = GetTickCount();
    	while( GetTickCount() - dwStart <= (2 * 1000) )
    	 {
    	     DoEvents(); 
    	    if(stoploop == true) break; 
    	}
    	if(stoploop == true) break; 
    	GetPandT(); // Récupère pression et température
    	}
    	stoploop = false;
    }
    La première boucle while attend que l'utilisateur clique sur un deuxième bouton qui met la variable boolénne stoploop à true. La deuxième boucle while, qui est en fait une temporisation, attend 2 secondes avant de relancer la requête vers les capteurs (temps d'intégration nécessaire au capteur). Le DoEvents() permet de récupérer les autres actions, et notamment le changement d'état de stoploop.

    Tout se passe bien à condition que la souris "ne bouge pas trop" pendant la boucle. Si je fais attention à cela et clique sur le bouton Stop (qui met stoploop à true), tout se passe bien. Mais si je balade la souris un peu partout dans l'écran, là c'est le plantage.

    Y aurait-il moyen par exemple de bloquer la souris et d'attendre que l'utilisateur frappe n'importe quelle touche pour quitter la boucle ?
    Ou si vous avez des pistes pour conserver le code "presque" tel quel ?
    Merci.

  2. #2
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 102
    Points : 111
    Points
    111
    Par défaut
    Pour faire ce genre d'applications, tu devrais regarder du côté des threads...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Salut,

    je ne souhaite pas utiliser les threads sur ce coup-là.
    Je pense que c'est le DoEvents() qui doit saturer le buffer. C'est pourquoi j'aimerais ne scanner que le clavier et sortir de la boucle dès qu'une touche est appuyée. Ou trouver une autre méthode.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    normal tu empeches l'appli de recevoir les messages .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // 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
        }
    rajoutes ça dans ta boucle pour que l'appli continue de traiter les mess claviers souris fenetre etc...


  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Salut Farscape,

    en fait je traite le code que tu indiques dans la fonction nommée "DoEvents", dont je te joins l'implémentation ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DoEvents() 
    { 
       MSG msg; 
     
       while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
       { 
          TranslateMessage(&msg); 
          DispatchMessage(&msg); 
       } 
    }
    Je l'ai déjà utilisée dans d'autres boucles, mais c'est la première où je rencontre ce problème.

    Rem : Je remarque que tu as deux lignes de code en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       AfxGetApp()->OnIdle(0);   // updates user interface 
       AfxGetApp()->OnIdle(1);   // frees temporary objects
    Je vais réessayer avec ces deux lignes de code en plus.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    le:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if (!AfxGetApp()->PreTranslateMessage(&msg))
       {
          ::TranslateMessage(&msg);
          ::DispatchMessage(&msg);
       }
    est important aussi.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    D'accord, je n'avais pas vu cette deuxième différence. Ceci dit, cela s'est mis à marcher rien qu'avec les deux dernières lignes. Plus de plantage en bougeant beaucoup la souris.
    Je vais rajouter la ligne que tu m'as indiquée.

    Encore merci .

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

Discussions similaires

  1. [MFC] Raccourcis sur un bouton avec visual 2005
    Par ricky78 dans le forum MFC
    Réponses: 3
    Dernier message: 09/10/2007, 14h28
  2. [MFC] Hyperlink sur un bouton
    Par Platypus dans le forum MFC
    Réponses: 2
    Dernier message: 15/12/2006, 16h26
  3. Boucle sur des boutons radios
    Par jmarey dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/05/2006, 11h03
  4. [MFC] Pb sur un bouton
    Par spirit_1999 dans le forum MFC
    Réponses: 13
    Dernier message: 15/06/2005, 13h38
  5. [MFC] image sur un bouton
    Par mfrai02 dans le forum MFC
    Réponses: 6
    Dernier message: 24/05/2005, 14h42

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