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

Windows Forms Discussion :

Probleme timer pour extraire une sequence d'une webcam


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut Probleme timer pour extraire une sequence d'une webcam
    Bonjour a tous,


    [Ma vie]

    apres pas mal de recherche sur le net, et sur ce forum tres utile, je n'ai pas trouvé la solution miracle que je cherchais...

    Mon probleme : j'ai un pti programme en C# dont je suis tres content qui me permet d'extraire des images a partir du flux d'une webcam et de les enregistrer. Le programme marche : je clic sur un bouton, ca capture et ca enregistre l'image. Jusque la, no probleme.

    Le but etant de prendre une sequence d'image, je veux automatiser cette tache. Ok, je mets un "for" et c'est reglé. Sauf que je veux des images toutes les secondes...

    [/ma vie] :p

    Probleme : automatiser une tache toutes les x secondes.

    Solution : Thread.sleep(xxx) => bug : plante le programme, et enregistre a chaque fois la premiere image (celle de t= 0s, et non celle de t=1s, t=2s..)
    De même si je fais un while avec un compteur qui fait une difference de temps -qui est soit dit en passant moche -.

    Question : Pourquoi mon sleep ne marche pas? mon thread est il bloqué? Le fonctionnement est il different de :

    // Mon bouton
    private void button5_Click(object sender, EventArgs e)
    {
    for(i=0;i<3;i++)
    {
    // Affiche dans label test + numero du test
    label4.Text = "test" + i;
    // Pause de 1sec
    System.Threading.Thread.Sleep(1000);
    }
    }

    car le resultat produit est juste : test2 dans label4.text au bout de 3sec.... alors que je voudrais voir test0, attendre 1sec, puis test1, 1sec, puis test2...

    en esperant avoir ete clair !

    Merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    J'ai pas spécialement de réponse à ton problème mais l'utilisation d'un timer ne serait pas plus simple?

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut
    ce que m'a conseillé djo.mos gentillement sur le chat et je suis entrain de chercher... mais bon, meme si ca marche avec Timer, j'aimerai comprendre l'erreur par curiosité

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    La mise à jour de ton label se fera qu'une fois que tu auras quitté la fonction

    D'ou l'utilité du Timer...

    Il faut laisser du temps au thread UI de faire son boulot et si tu le bloques (le Thread.Sleep() et beh, il ne peut rien faire... donc, il compte et quand il a fini de compter, sort de la boucle, de la méthode et prends le temps de rafraichir l'IHM, tout simplement

    The Monz, Toulouse

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut
    ok merci pour l'explication... je vois mieux le probleme

    question subsidiaire : je comprends pas entierement le timer...

    1-je créé mon objet, ca marche.

    2-je fais T.Start(); ca le lance

    3- je peux directement mettre un while(T.Interval > 200) {instructions}? ou je dois faire un T.Stop() pour y acceder?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    moi généralement je fais un truc qui ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    timer1.Interval = 1000;
                timer1.Tick += new EventHandler(timer1_Tick);
                timer1.Enabled = true;
                timer1.Start();
    faut penser à l'événement tick

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            private void button5_Click(object sender, EventArgs e)
            {
                a = Environment.TickCount;
                for (i = 0; i < 10; i++)
                {
                    while (Environment.TickCount - a < 1000) {}
     
                    label4.Text = "Tick count : " + Environment.TickCount.ToString() +" for : " + i.ToString();
                }
     
            }
    toujours pareil : ca affiche for : 9, donc ca bloque l'UI jusqu'a la sortie du for snif...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    ha tu fais comme ça toi!

    moi j'aurais plutot vu le truc comme ça:

    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
    20
     
    int i=0;
     
    private void button5_Click(object sender, EventArgs e)
    {
                timer1.Interval = 1000;
                timer1.Tick += new EventHandler(timer1_Tick);
                timer1.Enabled = true;
                timer1.Start();
     
    }
     
    void timer1_Tick(object sender, EventArgs e)
    {
             label4.Text = "Tick count : " + i.ToString()
        if(i==10)
        {
             timer1.Tick-= timer1_Tick;
        }
    }

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    Moi c'est System.Windows.Forms celui là!

    Dans les composants de la boite à outil!
    Je sais pas si c'est utilisable dans une classe!
    Je penses!

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut
    Citation Envoyé par NejNej Voir le message

    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
    20
    21
     
    int i=0;
     
    private void button5_Click(object sender, EventArgs e)
    {
                timer1.Interval = 1000;
                timer1.Tick += new EventHandler(timer1_Tick);
                timer1.Enabled = true;
                timer1.Start();
     
    }
     
    void timer1_Tick(object sender, EventArgs e)
    {
             label4.Text = "Tick count : " + i.ToString()
        i++;
        if(i==10)
        {
             timer1.Tick-= timer1_Tick;
        }
    }
    Merci pour la reponse (rapide en plus). Il manque juste un i++ dans la fonction et ca marche (je viens de tester). Merci beaucoup :p

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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