[Résolu] Problème Programmation MFC

Problème Programmation MFC [Résolu] - C - Programmation

Marsh Posté le 12-05-2006 à 19:17:00    

Bonjour,
 
 
 
je développe actuellement une application avec Visual C++ et je me sert des MFC.  
 
 
 
Bref j'ai crée une Edit box dans laquelle je voudrais afficher mon
buffer (il recoit des données en boucle). Cependant il n'affiche les
données de mon buffer qu'à la fin de la boucle et non durant toute la
boucle. Si quelqu'un peut me debloquer..
 
 
 
Merci.
 
 
 
 
 
 Code  :
 
void CClientDlg::OnRecept()  
{
     static char buffer[TAILLE];  
    int test=0;
    int autori=0;
    char lettre=0;
    int i;
 
    SOCKET descripteur;
    sock(&descripteur);
         
    for(int j=0;j<20;j++)  
    {
        for (i=0;i<TAILLE-1;i++)
        {
            buffer[i]=lettre = reception();  
     
        }
 
        buffer[i] = '\0';
 
        for (i=0;i<2;i++)
        reception();
                 
        envoi(buffer,descripteur);
     
        ctrl_valeur.SetWindowText(buffer+1);
                 
    }
 }
 
 
 
 
Je début dans les MFC soyez indulgents :]
 
 
 
Dans ClassWizard j'ai ajouté une variable de category Control de type CEdit


Message édité par Atlanted le 13-05-2006 à 20:04:43
Reply

Marsh Posté le 12-05-2006 à 19:17:00   

Reply

Marsh Posté le 12-05-2006 à 22:43:23    

debug :o

Reply

Marsh Posté le 12-05-2006 à 22:43:37    

et balise [ code ] aussi :o

Reply

Marsh Posté le 13-05-2006 à 18:13:58    

Le SetWindowText produit un message WM_PAINT qui est traité par l'application quand elle est libre. Or ici la boucle de traitement monopolise le temps processeur donc le contrôle à l'écran n'est mis à jour qu'à la fin de la méthode.
 
Une solution consiste à intercaller le code suivant après le SetWindowText:
 

Code :
  1. MSG msg;
  2. while(GetMessage(&msg,NULL,0,0))
  3. {
  4.   TranslateMessage(&msg);
  5.   DispatchMessage(&msg);
  6. }


 
Pour les détails : http://bob.developpez.com/tutapiwin/article_23.php

Reply

Marsh Posté le 13-05-2006 à 19:28:37    

Merci pour cette réponse
 
tu me conseilles donc de faire ceci ?  
 

Code :
  1. ctrl_valeur.SetWindowText(buffer+1);
  2.  ctrl_valeur ctrl_valeur;
  3.  
  4.   while(GetMessage(&ctrl_valeur,NULL,0,0))
  5.  
  6.   {
  7.  
  8.    TranslateMessage(&ctrl_valeur);
  9.  
  10.    DispatchMessage(&ctrl_valeur);
  11.  
  12.   }
  13. }

Message cité 2 fois
Message édité par Atlanted le 13-05-2006 à 19:33:58
Reply

Marsh Posté le 13-05-2006 à 19:47:24    

Atlanted a écrit :


...
ctrl_valeur ctrl_valeur;
 while(GetMessage(&ctrl_valeur,NULL,0,0))
...
[/code]


Ouh la la mais ca vient faire quoi c'est "ctrl_valeur" la? t'as buggé ou quoi :lol:


Message édité par breizhbugs le 13-05-2006 à 19:48:06
Reply

Marsh Posté le 13-05-2006 à 19:50:11    

MSG ctrl_valeur;
 
J'ai mis ca dans mon source :]
 
pas ctrl_valeur ctrl_valeur;

Reply

Marsh Posté le 13-05-2006 à 19:51:38    

Parcontre ca m'affiche bien ce qu'il y dans buffer mais sans le "rafraichir". En faite buffer contient 8 octets qui sont écrasés sans arrêt pour afficher des valeurs en continue.

Reply

Marsh Posté le 13-05-2006 à 19:58:19    

Tu as deja un controle qui s'appelle "ctrl_valeur"!
EDIT: pour ta deuxieme remarque, c'est normal, car setwindowtext remplace ce qu'il y a dans le controle par ce que tu lui donne en parametres.


Message édité par breizhbugs le 13-05-2006 à 19:59:38
Reply

Marsh Posté le 13-05-2006 à 20:03:38    

C'est bon j'ai réussi. Merci

Reply

Marsh Posté le 13-05-2006 à 20:03:38   

Reply

Marsh Posté le 14-05-2006 à 10:21:15    

Atlanted a écrit :

C'est bon j'ai réussi. Merci


On peut savoir comment STP ?

Reply

Marsh Posté le 14-05-2006 à 10:22:42    

Atlanted a écrit :

tu me conseilles donc de faire ceci ?


Non. Certainement pas en remplaçant la structure MSG par un CEdit* : il y a aucune chance que ça compile.

Reply

Marsh Posté le 14-05-2006 à 10:49:15    

Non mais je n'ai pas fais ça, maintenant ca marche.
 

Code :
  1. ctrl_valeur.SetWindowText(buffer+1);
  2.  CClientApp ::PumpMessages;
  3. {
  4.  MSG ctrl_valeur;
  5.  while(PeekMessage(&ctrl_valeur, NULL, 0, 0, PM_REMOVE))
  6.     {
  7.         if (!AfxGetApp()->PreTranslateMessage(&ctrl_valeur))
  8.       {
  9.          ::TranslateMessage(&ctrl_valeur);
  10.          ::DispatchMessage(&ctrl_valeur);
  11.  } 
  12.  AfxGetApp()->OnIdle(0);   // Rafraîchi l'interface utilisateur
  13.  AfxGetApp()->OnIdle(1);   // Libère temporairement l'objet
  14.     }
  15. }


 
et en rajoutant un static PumpMessages(); dans ma classe

Reply

Marsh Posté le 14-05-2006 à 11:01:16    

Ah bon OK

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed