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

C# Discussion :

Différence entre Timer et thread ?


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut Différence entre Timer et thread ?
    Bonjour,

    J'utilise un Timer pour actualiser des infos provenant de mon hardware. L'intervalle est toutes les 3 secondes.
    Le problème est que toutes les 3 secondes, quand il interroge le hardware, la fenêtre se freeze le temps de récupérer les infos, genre 500ms.
    Ces problèmes de lenteur sont embêtantes.
    Pourrais-je à la place utiliser un thread à part qui se lancerait toute les 3 secondes et qui ne freezerait pas ma fenetre ?
    Si oui comment ?
    Mais, le "tick" du timer ne créer pas déjà un thread à part ?

    Merci de m'éclairer sur la différence entre les deux, et quel serait le mieux niveau performance pour mon souci.

  2. #2
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    c normal que votre fenettre se friiizzz puisque le Timer utilise le thread principale de votre application ce lui qui cree et met a jour l'interface de ton application.

    la solution que je te conseil de faire est utilise le backgroundworker avec bien sur votre Timer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //double click sur le backgroundworker 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
       ///ton code pour actualiser des infos provenant de mon hardware
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void timer1_Tick(object sender, EventArgs e)
            {
               backgroundWorker1.RunWorkerAsync();
            }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Merci pour ton aide.
    Mais à vue d'œil quand le timer va appeler le backgroundworker, il va attendre la fin du backgroundworker non ? Donc freezer ?

  4. #4
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    Mais à vue d'œil quand le timer va appeler le backgroundworker, il va attendre la fin du backgroundworker non ? Donc freezer ?
    la fonction RunWorkerAsync() lance le backgroundworker en mode asynchrone .alors en thread parallèle que le thread Princopale
    donc pas de freezer de form(thread principale).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    ok, je vais tenter.

    Sinon, est-ce qu'un thread avec un sleep() à l'intérieur ferait bien le boulot ??

  6. #6
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    oui si tu le fait sleeping pendent le 3s mais a condition que tu doit le faire maintenir meme apres la fin de son traitement soit avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //dans la conception de form
     backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.RelancemonThread);
    //dans ta form 
    private void RelancemonThread(object sender, RunWorkerCompletedEventArgs  e)
            {
                backgroundWorker1.RunWorkerAsync();
     
            }

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    J'ai tenté le code qui à chaque tick du timer appelle le BackgroundWorker, mais exception :
    BackgroundWorker est actuellement occupé et ne peut pas exécuter plusieurs tâches simultanément.
    Si je le Cancel avant de le lancer, je n'aurai pas mes infos !
    Comment faire ?

  8. #8
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    c normal puisque le backgroundworker n'a pas encore termine son traitement
    et il n'est pas encore completed

    ça vous dire que le traitement de associe a votre backgroundworker nessicite plus que 3 s ou vous n'avez pas bien l'utlise dans ton code tu peut me donnee ton code ..
    j'att votre reponse

  9. #9
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Et avec
    System.Timers.Timer
    à la place de
    System.Windows.Forms.Timer
    Ca n'irait pas mieux ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Quelle est la différence ?

  11. #11
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    System.Windows.Forms.Timer tourne dans le thread de la Form dans laquelle il est déclaré.
    System.Timers.Timer tourne dans un thread séparé.
    Ce qui fait que si le traitement est long dans le Elapsed (pour Timers.Timer et Tick pour Forms.Timer) il ne freeze pas ta form.
    Par contre il faut faire attention à l'accès aux composants de ta form qui ne sera plus threadsafe.

  12. #12
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    il faut faire des invokes pour appel les fonctions de mise des composantes bien sûr a travers des delegates

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Merci pour votre aide.
    C'est justement ça que je ne parviens pas à faire, rafraichir un label qui est dans ma form en utilisant System.Timers.Timer ?
    Avez-vous un bout de code, je ne trouve pas ça sur la msdn ?
    Merci

  14. #14
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
            delegate void delegateaffiche (string msg);//vous declarez votre type delegate sur un type de fonction qui prend comme parametre un string et qui returne un void 
     
            delegateaffiche dle;//vous instancie un objet de ce type 
     
     
                dle = new delegateaffiche(affiche);//vous relie votre type dle avec la fonction affiche 
     
           // la fonction de mettre a jour votre appel 
            private void affiche(string msg)
            {
             label1.Text=msg ;
     
            }
     
     
     
     
    //ici vous utilise la type delegate les paramettre de votre fonction mettre a jour votre label son entre sous form d'un table d'objet dans notre cas on un seul paramettre a lors , si vous avez plus alors object param={"param1","param2 ",parm3 } param3 deja declare ...
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                object[] param = { "hi backgroundworker1" };
     
                label1.Invoke(dle, param);//pour invoker le delege de votre fonction de mise a jour 
            }
    j'espere etre clear ...

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Merci pour ton aide.
    Voilà mon code de test, mais erreur de compilation car mon label1 n'est pas en 'static'.
    "Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique"
    Mon but n'est pas de le mettre en static..
    Comment faire ?!

    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
    22
    23
    24
    25
    26
    public partial class Form1 : Form
        {
            System.Timers.Timer testTimer = new System.Timers.Timer();
            delegate void delegateaffiche();
            delegateaffiche dle = new delegateaffiche(affiche);
     
            public Form1()
            {
                InitializeComponent();
     
                testTimer.Interval = 1000;
                testTimer.Elapsed += new System.Timers.ElapsedEventHandler(testTimer_Elapsed);
                testTimer.Start();
        }
     
            private static void affiche()
            {
    // Erreur : Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique
                 label1.Text = DateTime.Now.ToShortTimeString();
            }
     
            private void testTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                label1.Invoke(dle);
            }
        }

  16. #16
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    j'ai teste votre code il est great ça marche bien
    et j'ai remarque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delegateaffiche dle = new delegateaffiche(affiche);
    l'initialisation de object se fait au constructeur ou au fonction load de votre form.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Je l'ai mis dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Form1()
    {
        dle = new delegateaffiche(affiche);
        ...
    }

    Mais toujours la meme erreur !
    label1 : Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique

  18. #18
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    j'ai teste ton code et ça marche pour moi vous me donner tout votre code form

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Pour ne pas pourir le forum, cf le fichier rar en piece jointe.
    Merci !
    Fichiers attachés Fichiers attachés

  20. #20
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    ah bon j'ai pas vu que vous avez declare votre fonction affiche comme une fonction static enleve le static de votre fonction affiche .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    private void affiche()
            {
     
                 label1.Text = DateTime.Now.ToShortTimeString();
            }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Thread] différence entre les méthodes start/run
    Par maetalkrio dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/10/2009, 17h06
  2. Différence entre un thread et un backgroundworker
    Par istace.emmanuel dans le forum C#
    Réponses: 2
    Dernier message: 17/10/2009, 09h32
  3. Différence entre Thread et ThreadLocal
    Par fantomasmusic dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 27/10/2008, 14h31
  4. Réponses: 5
    Dernier message: 14/08/2008, 11h25
  5. Différence entre process et thread
    Par Mastero dans le forum MFC
    Réponses: 6
    Dernier message: 19/07/2005, 13h52

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