Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème simple avec mon code

    14 septembre 2017 à 17:57:43

    Bonsoir tout le monde,

    je me permets de vous écrire car j'ai un problème et j'espère vraiement que vous pourriez m'aider svp : 

    donc voilà, ici j'essaie de faire en sorte d'afficher un message qui est "c'est moins" ou "c'est plus" mais le problème c'est que moi je veux qu'il m'affiche le message puis que ce message disparaisse , je ne veux pas qu'il reste à l'écran donc moi j'ai fait comme cela: 

    mais le problème c'est qu'au lieu de me l'afficher il me montre rien on ne voit pas le message et pourtant il exécute bien le code:

    genre moi ce que je veux c'est qu'il me montre le message puis ce même message disparait ...  

    private void TryAgain(int Number)
            {
                if (Number<Random)
                {
                    lb.Text = "C'est plus";
                    System.Threading.Thread.Sleep(2000);
                    lb.Text = "";
                }
                else
                {
                    lb.Text = "C'est moins";
                    System.Threading.Thread.Sleep(2000);
                    lb.Text = "";
    
                }
    
            }



    merci encore pour votre aide 

    -
    Edité par amr1080 14 septembre 2017 à 18:00:10

    • Partager sur Facebook
    • Partager sur Twitter
      14 septembre 2017 à 18:12:53

      Hello,

      Comme l'a dit bacelar dans l'autre thread il faut arrêter avec les Sleep() dans le thread principal d'une application WinForm, ce thread est utilisé pour répondre aux actions de l'utilisateur, s'il est bloqué, il risque de ne pas répondre immédiatement et Windows va croire que l'appli ne répond plus car elle ne fait pas ce que demande l'utilisateur.


      C'est une mauvaise pratique qu'il faut éviter.

      Il vaut mieux utiliser System.Windows.Forms.Timer dans une application WinForm. Tu vas afficher ton texte, lancer le timer paramétré pour envoyer un tick toutes les 2s et sur l'event Tick tu vas cacher ton texte. Regarde l'exemple dans le lien ça devrait t'aider.

      • Partager sur Facebook
      • Partager sur Twitter
      Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)
        14 septembre 2017 à 18:43:44

        Comme indiqué ici : https://openclassrooms.com/forum/sujet/probleme-lors-de-laffichage-des-couleurs?page=1#message-91963919

        Vous ne devez pas utiliser Sleep et l'usage du timer est ici encore le plus simple.

        Il faut comprendre que tout les affichages se font de manière asynchrone (ligne 5, le contrôle n'arrête pas le programme pour demander au Kernel de réveiller la carte graphique pour qu'elle aille récupérer en mémoire centrale des caractères qu'elle devra convertir en splines pour la police courante et faire un rendering des formes entre les splines, NON, le contrôle ne fait que se marqué comme "Dirty" pour qu'au prochain rafraichissement de l'affichage, on fasse tout ce merdier).

        Il n'y a que le thread d'affichage en mesure de faire le rafraichissement de l'affichage, c'est pour cela qu'il ne faut jamais faire de chose longue dans ce thread. Avec votre Sleep vous bloquez le thread courant, donc celui d'affichage donc le vous bloquez le rafraichissement de l'affichage.

        Ce qu'il faudrait faire, c'est modifier le Text, puis activer un timer qui appellera une méthode à la l'expiration du timer. Dans cette méthode d'expiration (la méthode de callback ajoutée à l’évènement qui va bien), vous faire la 2 ème modification de Text.

        Ainsi, à aucun moment vous ne bloquez le thread d'affichage.

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          16 septembre 2017 à 19:37:12

          Bonsoir tout le monde, 

          après de longue recherche et teste je galère vraiement pour l'utilisation du timer déjà parce que j'ai du mal à comprendre le concept ensuite c'est quoi le tick ? 

          voila mon code qui ne fonctionne pas certes mais je ne comprend pas trop comment le faire fonctionner svp ...  :

          en haut je l'ai initialiser: public Timer mytimer = new Timer();

           private void TryAgain(int Number)
                  {
                      if (Number<Random)
                      {
                          
                          mytimer.Interval = 5000;
                          mytimer.Tick += new EventHandler(timer1_Tick);
                          mytimer.Start();
                          lb.Text = "C'est plus";
                          //System.Threading.Thread.Sleep(2000);
                          mytimer.Stop();
                          lb.Text = "";
                      }
                      else
                      {
          
                          mytimer.Interval = 5000;
                          mytimer.Tick += new EventHandler(timer1_Tick);
                          mytimer.Start();
                          lb.Text = "C'est moins";
                          mytimer.Stop();
                         // System.Threading.Thread.Sleep(2000);
                          lb.Text = "";
          
                      }
                      //timer1.Enabled = false;
          
                  }
          
                  private void YouWin()
                  {
                      MessageBox.Show("Félicitations vous avez gagné :-)");
                      btValider.IsAccessible = false;
                  }
          
                  private void NewGame()
                  {
                      Random = NbRandom();
                      lb.Text = "";
                  }
          
                  private void timer1_Tick(object sender, EventArgs e)
                  {
                      mytimer.Interval = 5000;
                      mytimer.Tick += new EventHandler(timer1_Tick);
                      mytimer.Start();
                      lb.Text = "C'est plus";
                      //System.Threading.Thread.Sleep(2000);
                      mytimer.Stop();
                      lb.Text = "";
                  }

          merci d'avance pour votre aide 

          je me permets juste de vous rappeler que mon but ici est de faire apparaitre le message c'est ou c'est moins juste 2-3 secondes puis il disparait merci ... 

          -
          Edité par amr1080 16 septembre 2017 à 19:53:11

          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2017 à 19:54:50

            Salut

            Tu peux déjà essayé en retirant mytimer.Start(); de l'événement timer1_Tick et également le lb.Text = "C est plus"; du même événement

            Ah oui et également tu peux retirer le mytimer.Stop(); de ton If Else puisqu'il sera stoppé dans ton événement tick.

            -
            Edité par Fellerson 16 septembre 2017 à 19:56:47

            • Partager sur Facebook
            • Partager sur Twitter
              16 septembre 2017 à 21:59:25

              Hello,

              Il faut regarder la doc du timer mais c'est assez simple à comprendre.
              Le timer est créé et démarré, tu lui donnes un intervalle, par exemple 5 secondes.

              Ca signifie que toutes les 5 secondes l'événement Tick du timer va être déclenché, à toi ensuite de voir ce que tu veux faire là dedans ;)

              • Partager sur Facebook
              • Partager sur Twitter
              Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)
                17 septembre 2017 à 8:27:14

                Voilà qui marche :

                private void TryAgain(int Number)
                        {
                
                            int iRandom = 5;
                            tmrDisplay.Interval = 5000;
                
                            if (Number < iRandom)
                            {
                
                                tmrDisplay.Tick += new EventHandler(tmrDisplay_Tick);
                                tmrDisplay.Start();
                                lblDisplay.Text = "C'est plus";
                            }
                            else
                            {
                
                                tmrDisplay.Tick += new EventHandler(tmrDisplay_Tick);
                                tmrDisplay.Start();
                                lblDisplay.Text = "C'est moins";
                            }
                        }
                
                        private void tmrDisplay_Tick(object sender, EventArgs e)
                        {
                            tmrDisplay.Stop();
                lblDisplay.Text = ""; }

                Par flemme j'ai pas généré un chiffre au hasard je l'ai fixé à 5.

                -
                Edité par Fellerson 17 septembre 2017 à 8:28:40

                • Partager sur Facebook
                • Partager sur Twitter
                  17 septembre 2017 à 9:13:12

                  Bonjour à tous, 

                  merci pour vos réponses et merci bcp SteveFeller pour la solution que tu m'a proposé je ne l'aurai jamais trouvé maintenant j'aurai quelques denières questions là-dessus avant que je clôture le sujet svp: 

                  1) En faites dans la méthode timer1_tick c'est là que l'on stoppera l'évent donc timer1.stop() il sera toujours là jamais ailleurs dans mon code ?

                  2)  timer1.Tick += new EventHandler(timer1_Tick); ==> cela veut dire quoi en faites ? tu crées un nouvel évent sur le timer c'est ça ? 

                  3) c'est quoi le tick svp ? 

                  et voilà merci encore à tous plus jamais j'utiliserai de sleep  

                  Pyrobolser : crois-moi j'ai lu 4 fois la documentation (le lien que tu m'a mis plus haut mais c'est pas évident à comprendre pour un débutant je te jure ... ) 

                  merci encore 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 septembre 2017 à 9:31:00

                    Salut

                    1 : tu pourrais stoper le timer autre part dans ton code si tu en avais besoin, mais dans ton cas ça n'est pas utile.

                    2 : Cela veut dire que tu créé l'événement du timer. Tu pourrais double-cliquer sur le timer dans l'interface graphique pour le créé qu'une seule fois et ne plus le créer dans le code si tu le glissais par l'interface graphique

                    3 : le tick c'est le nom de l'événement du timer, comme le nom de l'événement "click" d'un bouton par exemple.

                    Voilà ce que donnerait mon code si je glissais le timer par l'interface graphique et que je le créé plus dans le code en avec public Timer tmrDisplay = new Timer(); 

                     private void TryAgain(int Number)
                            {
                    
                                int iRandom = 5;
                    
                                if (Number < iRandom)
                                {
                    
                                    tmrDisplay.Start();
                                    lblDisplay.Text = "C'est plus";
                                }
                                else
                                {
                    
                                    tmrDisplay.Start();
                                    lblDisplay.Text = "C'est moins";
                                }
                            }
                    
                            private void tmrDisplay_Tick(object sender, EventArgs e)
                            {
                                tmrDisplay.Stop();
                                lblDisplay.Text = "";
                            }


                    Cela fonctionne tout aussi bien.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    problème simple avec mon code

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown