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 :

Event tick de timer créé dans un thread


Sujet :

Windows Forms

  1. #1
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut Event tick de timer créé dans un thread
    Bonjour,
    J'ai un petit blème avec un timer.
    1. Je crée ce timer sur un événement Created d'un FilesSystemWatcher.
    2. J'initialise les propriétés de ce timer (Interval, tick, start())
    3. Je place ce timer dans un ArrayList.
    Résultat : l'évent. tick de ce timer n'arrive jamais.
    Constatations : j'ai toujours mon timer dans ma liste, je peux lire ses propriétés.

    Si par contre je crée ce timer sur un click de bouton (je le place aussi dans la liste), l'évent tick se déclenche sans problèmes.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    public partial class Form1 : Form
    	{
    		private FileSystemWatcher fsw;
    		private ArrayList al;
     
    		public Form1()
    		{
    			InitializeComponent();
    			fsw = new FileSystemWatcher();
    			fsw.Path = "C:\\temp";			
    			fsw.Created += new FileSystemEventHandler(fsw_Created);
    			fsw.EnableRaisingEvents = true;
    			al = new ArrayList();
    		}
     
    		void fsw_Created(object sender, FileSystemEventArgs e)
    		{
    			lock (al)
    			{
    				al.Add(new TTest(al));
    			}
    		}
     
     
    		private void button1_Click(object sender, EventArgs e)
    		{
    			al.Add(new TTest(al));
    		}
    	}
     
    	class TTest
    	{
    		public Timer t;
    		private ArrayList Owner;
     
    		public TTest(ArrayList aOwner)
    		{
    			Owner = aOwner;
    			t = new Timer();
    			t.Interval = 3000;
    			t.Tick += new EventHandler(t_Tick);
    			t.Start();
    		}
     
    		void t_Tick(object sender, EventArgs e)
    		{
    			t.Stop();
    			Owner.Remove(this);
    		}
    	}
    }
    L'événement Created du fsw est threadé. Mais je ne comprends pas pourquoi cela empèche l'event tick du timer de se déclencher.

    En fait, si je mets fsw.SynchronizingObject = this à la création du fsw il n'y a pas de problème. (ou CheckForIllegalCrossTreadCalls = false). Le problème est que dans mon programme, le fsw n'est pas un champ d'une Windows Form (comme dans mon exemple) mais d'un objet "maison".

    Si quelqu'un à une petite idée ??
    Bonne fin de journée à tous !!

  2. #2
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Voilà quelques pistes.
    Pour ce qui est du timer, il est préférable d'utiliser un System.Timers.Timer que celui de System.Windows.Forms. Cela évite les problèmes d'événements non thread-safe. Il faut toutefois faire attention aux accès concurrents !!

    Pour les accès à des objets non thread-safe :
    Comment faire des appels thread-safe aux contrôles Windows Forms

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

Discussions similaires

  1. Expose event dans un thread
    Par minours dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 25/02/2010, 15h05
  2. un timer dans un thread
    Par LaDeveloppeuse dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/11/2007, 21h15
  3. comment acceder à un timer dans un thread?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/07/2007, 10h04
  4. Réponses: 26
    Dernier message: 13/12/2006, 08h35
  5. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 10h20

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