none
attendre qu'un évènement dure quelques secondes avec DispatcherTimer RRS feed

  • Discussion générale

  • Bonjour à tous, 

    j'ai déjà posé cette question dans le même forum, mais je n'est pas pus la résoudre, donc le vais la reformuler et excusez moi pour l'ennui ^^!

    J'ai développé une application de reconnaissance de geste avec la kinect! 

    Si les deux main sont au dessus de la tête pour 3 secondes, un message vocale sera lu.

    J'ai écris ce code:

    public System.Windows.Threading.DispatcherTimer timer_gest;
    
             
    
         private void TimerTicked(object sender, EventArgs args)
        {
           timer_gest = new System.Windows.Threading.DispatcherTimer();
        timer_gest.Interval = TimeSpan.FromSeconds(3); 
        timer_gest.Tick += TimerTicked; 
        timer_gest.Stop();
        
        }
    
    
    private void RecongniseGesture(Joint Head, Joint HandLeft, Joint HandRight)
            {
                if ((HandRight.Position.Y > Head.Position.Y) && (HandLeft.Position.Y > Head.Position.Y))
                {
                    txtMsg3.Text = "Vos mains sont au dessus de la tête";
    monMedia.Source = new Uri(@"c:\Default.wav");
                    monMedia.LoadedBehavior = MediaState.Play;  //Play
                    monMedia.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(monMedia_MediaFailed);              
    
               }
    else
                {
                    txtMsg2.Text = "En attente de geste";
                }
    
            }
    
    
    mais je savais pas comment mettre les choses en ordre pour que le son ne sera lu que si le geste persiste 3 seconde! Pouvez-vous m'aider svp ? :)


    DKF

    • Type modifié Aurel Bera mardi 12 février 2013 08:55 Discussion
    dimanche 3 février 2013 22:39

Toutes les réponses

  • bonjour,

    je n'ai jamais utilisé kinect. je croit que ton événement de n'ai pas bien réalisé.

    essaye de remplacer :

    timer_gest.Tick += TimerTicked; 

    par :

    timer_gest.Tick += new EventHandler(timer_gest_tick);

    et puis rajoute ce que tu veux faire au bout de 3 seconde dans cette méthode :

    private void timer_gest_tick(object source, EventArgs e)
            {
                //code à réaliser
            }
    en plus il faut que tu met 
    timer_gest.Start();
    quand tu veux qu'il commence et 
    timer_gest.Stop();
    quand tu veux le stoppé


    lundi 4 février 2013 08:48
  • Merci Ahmed, 

    j'ai essayé ta proposition, j'ai fais :

    private void RecongniseGesture(Joint Head, Joint HandLeft, Joint HandRight)
     {       
     if ((HandRight.Position.Y > Head.Position.Y) && (HandLeft.Position.Y > Head.Position.Y))
                {
                    txtMsg3.Text = "Vos mains sont au dessus de la tête";
                                    timer_gestON = new System.Windows.Threading.DispatcherTimer();
                    timer_gestON.Interval = TimeSpan.FromMilliseconds(3);
                    timer_gestON.Tick += new EventHandler(timer_gestON_tick);
                    timer_gestON.Start();
    }
    
    
                }
    
    private void timer_gestON_tick(object source, EventArgs e)
            {
                ///************************  partie ajouté pour le son **************************/
    
                monMedia.Source = new Uri(@"c:\vos_mains_sont_au_dessus_de_la_tête.wav");
    
                monMedia.LoadedBehavior = MediaState.Play;  //Play
                monMedia.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(monMedia_MediaFailed);
                
                /**********************Partie ajoutée pour le web request *********************************************************************/
                WebRequest myRequest = WebRequest.Create("http://192.168.16.152/micom/lamp.php?room=entree&order=1");
                HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse();
                // Display the status.
                Console.WriteLine(response.StatusDescription);
                // Get the stream containing content returned by the server.
                Stream dataStream = response.GetResponseStream();
                // Open the stream using a StreamReader for easy access.
                StreamReader reader = new StreamReader(dataStream);
                // Read the content. 
                string responseFromServer = reader.ReadToEnd();
                // Display the codntent.
                Console.WriteLine(responseFromServer);
                // Cleanup the streams and the response.
                reader.Close();
                dataStream.Close();
                response.Close();
                timer_gestON.Stop();
            }
    
    Je pense encore que le Timer n'attend pas que le geste dure 3 seconde mais juste après 3 secondes de détection il lance le média et une redirection web.


    DKF

    lundi 4 février 2013 10:38
  • qu'est ce qui se passe exactement en exécutant ce code?


    lundi 4 février 2013 10:58
  • ce qui se passe c'est que après 3 secondes de détection le son marche.

    Si je fais deux fois le geste, le message vocal est lu 2 fois successives, alors que il faut le jouer juste si le geste dure 3 secondes. 


    DKF

    lundi 4 février 2013 11:17
  • essaye ça :

    je te conseille de faire ceci: bool mainDejaLever = false; public System.Windows.Threading.DispatcherTimer timer_gestON_tick; int nombreSeconde=0; private void TimerTicked(object sender, EventArgs args) { timer_gestON_tick = new System.Windows.Threading.DispatcherTimer(); timer_gestON_tick.Interval = TimeSpan.FromSeconds(1); timer_gestON_tick.Tick += new EventHandler(timer_gestON_tick_tick);; timer_gestON_tick.Start(); } private void RecongniseGesture(Joint Head, Joint HandLeft, Joint HandRight) { if ((HandRight.Position.Y > Head.Position.Y) && (HandLeft.Position.Y > Head.Position.Y)) { if(mainDejaLever) { if(nombreSeconde==3) { txtMsg3.Text = "Vos mains sont au dessus de la tête"; monMedia.Source = new Uri(@"c:\Default.wav"); monMedia.LoadedBehavior = MediaState.Play; //Play monMedia.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(monMedia_MediaFailed); nombreSeconde=0; } else nombreSeconde+=1; } else { mainDejaLever=true; nombreSeconde=1; } else { txtMsg2.Text = "En attente de geste";

    mainDejaLever=false; } } private void timer_gestON_tickON_tick(object source, EventArgs e) { RecongniseGesture("je ne sais pas qu'est ce que tu vas mettre ici vu que je t'ai dit que je ne connais pas kinect"); }


    après le code de kinect je ne connais pas
    la j'ai augmenté le nombre de ticks a une tick par seconde et a chaque fois qu'il atteint trois sans baisser la main il déclenche ta procédure que j'ai modifié.

    tu peux aussi rajouter 2 bouton de stop et start du timer

    lundi 4 février 2013 11:17
  • Bonjour,

    je pense qu'il faut que tu stop le timer dès que l'utilisateur change de position et que tu le redémarre dès qu'il remet ses mains au-dessus de a tête.

    Quelque chose comme ça :

            private System.Windows.Threading.DispatcherTimer timer_gest = new System.Windows.Threading.DispatcherTimer { Interval = TimeSpan.FromMilliseconds(3) };
    
            private void RecongniseGesture(Joint Head, Joint HandLeft, Joint HandRight)
            {
                if ((HandRight.Position.Y > Head.Position.Y) && (HandLeft.Position.Y > Head.Position.Y))
                {
                    //  The user has his hands on the head
                    txtMsg3.Text = "Vos mains sont au dessus de la tête";
                    
                    //  ONLY if the timer is not yet enabled
                    if (!timer_gestON.IsEnabled)
                    {
                        //  Restart the timer (start it each time the user set his hands on the head)
                        StartTimer();
                    }
                }
                else
                {
                    //  The user move his hands: stop the timer to start it again as soon the user set his hands on the head
                    txtMsg3.Text = "Vos mains ont changé de position";
                    StopTimer();
                }
            }
    
            private void timer_gestON_tick(object source, EventArgs e)
            {
                ///************************  partie ajouté pour le son **************************/
    
                monMedia.Source = new Uri(@"c:\vos_mains_sont_au_dessus_de_la_tête.wav");
    
                monMedia.LoadedBehavior = MediaState.Play;  //Play
                monMedia.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(monMedia_MediaFailed);
    
                /**********************Partie ajoutée pour le web request *********************************************************************/
                WebRequest myRequest = WebRequest.Create("http://192.168.16.152/micom/lamp.php?room=entree&order=1");
                HttpWebResponse response = (HttpWebResponse)myRequest.GetResponse();
                // Display the status.
                Console.WriteLine(response.StatusDescription);
                // Get the stream containing content returned by the server.
                Stream dataStream = response.GetResponseStream();
                // Open the stream using a StreamReader for easy access.
                StreamReader reader = new StreamReader(dataStream);
                // Read the content. 
                string responseFromServer = reader.ReadToEnd();
                // Display the codntent.
                Console.WriteLine(responseFromServer);
                // Cleanup the streams and the response.
                reader.Close();
                dataStream.Close();
                response.Close();
    
                //  Stop the timer again. Will start again as soon as the user will set his hands on the head
                //      in the "RecongniseGesture" method
                StopTimer();
            }
    
            private void StartTimer()
            {
                timer_gestON.Tick += new EventHandler(timer_gestON_tick);
                timer_gestON.Start();
            }
    
            private void StopTimer()
            {
                timer_gestON.Tick -= new EventHandler(timer_gestON_tick);
                timer_gestON.Stop();
            }

    Ce qui est important, si je comprends bien, c'est de ne pas relancer le timer tant que l'utilisateur ne bouge pas ses mains : ce qui est réalisé par le "if (!timer_gestON.IsEnabled)"

    Dis nous si ça fonctionne comme tu le souhaite.

    lundi 4 février 2013 11:18
  • Merci beaucoup, j'essaie et je vous dis :)

    DKF

    lundi 4 février 2013 11:22
  • est ce que tu peux nous communiquer le résultat des nouvelles modifications et que'est ce que tu as fait au juste??
    mardi 5 février 2013 09:03
  • Bonjour, 
    Excusez moi pour le retard.
    Pour l'application, il y avait un problème mais lié au fonctionnement de la kinect(en fin, c'est ce que je pense!)

    En faite, la kinect renvoie une vidéo de 30 frames/s.
    ce qui veut dire que la procédure de reconnaissance que j'ai faites effectue le teste à chaque fois. C'est pour ça quand j'ai essayé les 2 propositions, le son se coupe tout le temps, malgré que en l'essayant sur un autre évènement (comme windows_loaded) il marche bien.

    Donc, en faisant le geste j'entends le message vocale qui commence et recommence tout le temps et ne se lit complètement qu'après avoir quitté la scène ( y a plus de frames qui contiennent des gestes).

    Je cherche maintenant a comparer les gestes entre les frames, ou bien fixer l'heure en détectant un geste et attendre 3 secondes puis voir s 'il y a toujours le même geste.

    j'essai de résoudre ce problème, mais j'ai encore besoin de vos aides! merci d'avance pour toute autres propositions ^^ 

    DKF

    mardi 5 février 2013 22:42
  • franchement comme je t'avais déjà dit kinect je connais pas trop, mais je vais essayer de te donner des hypothèse avec des potentiel solution

    hypothèse 1:

    normalement si la kinect fait du 30fps tu peux la réglé à 3 fps pour ton appli et comme ça tu n'a pas une pille des images

    hypothèse 2 :

    faire le test avec toutes les images pris par kinect et quand tu atteint les 90 images avec un test vrai tout au long des 90, tu lance

    bon après peut être que je n'ai pas bien compris le problème :p

    mercredi 6 février 2013 13:41
  • Bonjour,

    Nous changeons le type de votre question à « Discussion générale ». Si vous avez plus de temps pour réexaminer la question et fournir plus d'informations, n'hésitez pas à modifier le type du thread à « Question ». Si le problème est résolu, s’il vous plaît partagez la solution avec nous afin que la réponse puisse être trouvée et utilisée par d'autres membres de la communauté ayant des questions similaires.

    Merci !

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 12 février 2013 08:56