none
comment utiliser DispatcherTimer ? RRS feed

  • Discussion générale

  • Bonjour à tous, 

    Je veux jouer un son dans une application WPF mais aprés 2 seconde d'avoir détecter un geste.

    donc si par exemple les mains sont au dessus de la tête et que ce geste persiste pour 2 secondes, un son se déclenche indiquant qu'il a détecté un geste.

    j'ai fais un essai:

    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(2);
         timer_gest.Tick += TimerTicked; 
        
        }
     
                 
    private void RecongniseGesture(Joint Head, Joint HandLeft, Joint HandRight)
            {
    if ((HandRight.Position.Y > Head.Position.Y) && (HandLeft.Position.Y > Head.Position.Y))
                {
                     timer_gest.Start();
     timer1.Tick += TimerTicked;
    
    txtMsg3.Text = "Vos mains sont au dessus de la tête";
    
                }
    
    }

    Quand j'exécute le code, ça plante et le programme s'arrête.

    Autre chose, je pense que ce que j'ai fais, c'est attendre juste 2 secondes après avoir détecter le geste, mais il ce qu'il faut vraiment c'est voir si le geste va durer 2 secondes ensuite jouer le son.

    Avez-vous une idée comment le faire ?

    merci pour toute aide :)


    DKF

    • Type modifié Aurel Bera lundi 4 février 2013 09:48 Discussion
    mercredi 30 janvier 2013 11:11

Toutes les réponses

  • je pense que t'a une boucle infini dans ton code.

    Il faut arrété le timer une fois que le geste est bon:

    timer_gest.Start();
    timer1.Enables = false;


    mercredi 30 janvier 2013 12:04
  • Bonjour,

    Sur quelle ligne et avec quelle erreur (*toujours* indiquer ces infos en cas d'erreur SVP) ? timer_gest semble ne pas avoir été instancié ? Puis on déclenche un autre timer qui va instancier timer_gest qui lui va attendre deux secondes et rappeler également TimerTicked dans lequel on se trouve déjà donc la structure d'ensemble est assez bizarre ;-)

    Donc je verrais plutôt quelque chose :

    - dans RecognizeGesture (c'est appelé régulièrement ?), reconnaitre le geste et si ce n'est pas le même réinitialiser le moment ou ce geste a été détecté
    - sinon c'est le même et donc vérifier avec l'info mémorisée précédemment que la première détection a été faite il y a plus de deux secondes puis jouer le son

    Je pense que l'on n'a pas besoin de timer et qu'enregistrer le moment de la première détection sera suffisant.

    Mon incertitude est sur la fréquence avec laquelle RecognizeGesture est appelée (j'imagine que c'est du Kinect, pas utilisé mais j'imagine que c'est appelé par un évènement qui est appelé régulièrement ou alors rien ne se passe si la personne ne bouge pas du tout ? un timer ne me semble nécessaire que dans le second cas)

    D'après ce que je vois soit on se base sur SkeletonFrameReadey appelé environ 30 fois par seconde donc pas besoin de timer, soit sur un évènement qui signale un geste prédéfini ce qui n'est pas le cas ici ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mercredi 30 janvier 2013 12:30
    Modérateur
  • Je dirais plutôt:

    private DispatcherTimer _timer;

    public constructeurdelaclasse()
    {
       _timer = new DispatcherTimer{Interval = TimeSpan.FromSeconds(2), TimerClicker += OnTimerClicked};
    }

    private void TimerClicked(...)
    {
         // ton code
         // _timer.Stop();
    }

    private void MonEvent(...)
    {
        if (conditions && !_timer.IsEnabled)
              timer.Start();
    }


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mercredi 30 janvier 2013 13:00
  • Merci pour vos propositions.

    Patrice, Oui effectivement il s'agit d'une Kinect, avec laquelle je détecte un geste et gesture recognizer est appelé dès qu'il a un mouvement de personne dans la scène.

    on peut détecter le geste à chaque fois mais pour dire que c'est reconnu je pensais à l'idée de temps  car sinon à chaque fois que les mains sont au dessus de la tête, il va envoyer une requête pour commander des actionneurs, donc je veux pas que cette confusion se fasse dans l'application.

    Pour le Timer1, c'est juste une faute de frappe. Il y a que timer_gest. 

    Sinon je vérifie le morceau de code de Richard et je vous tiens informés.

    Merci à vous tous :)


    DKF

    mercredi 30 janvier 2013 14:11
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    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.

    jeudi 31 janvier 2013 12:30
  • Bonjour,

    Nous changeons le type de votre question à « Discussion générale » parce que vous n’êtes pas revenu avec les informations sollicitées. 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.

    lundi 4 février 2013 09:47