web-dev-qa-db-fra.com

démarrer une minuterie à partir de threads différents en c #

Bonjour, j’ai abordé un problème lié à la minuterie. J'espère que quelqu'un pourra vous aider.

  1. J'ai un formulaire Windows contenant un bouton
  2. quand je clique sur ce bouton je commence un fil paramétré
Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
  1. le code à l'intérieur du fil s'exécute très bien
  2. à la dernière ligne de ce fil je lance un minuteur

.

public void execute2(Object ob)
{
    if (ob is ExternalFileParams)
    {
        if (boolean_variable== true)
          executeMyMethod();//this also executes very well if condition is true
        else
        {
            timer1.enabled = true;
            timer1.start();
            }
        }
    }
}

5 mais l'événement tick de la minuterie n'est pas déclenché

Je travaille sur le framework VS2008 3.5. J'ai fait glisser le chronomètre de la boîte à outils et défini sa Interval sur 300 et tenté de définir la méthode Enabled true/false Est timer1_Tick(Object sender , EventArgs e) mais il ne s'est pas déclenché.

quelqu'un peut-il suggérer ce que je fais mal?

13
Swati


Vous pouvez essayer de démarrer le chronomètre de la façon suivante: 

Ajouter dans le constructeur de formulaire ceci: 

System.Timers.Timer aTimer = new System.Timers.Timer();
 aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
 // Set the Interval to 1 second.
 aTimer.Interval = 1000;

Ajoutez cette méthode à Form1: 

 private static void OnTimedEvent(object source, ElapsedEventArgs e)
 {
   //do something with the timer
 }

Sur le bouton clic événement ajoutez ceci: 

aTimer.Enabled = true;

Cette minuterie est déjà en place, donc pas besoin de démarrer une nouvelle discussion.

18
Gabriel

C'est vrai ce que dit Matias Fidemraizer. Mais, il y a un travail autour ...

Lorsque vous avez un contrôle sur votre formulaire qui est invocable (par exemple, une barre de statut), appelez-le!

Exemple de code C #:

private void Form1_Load(object sender, EventArgs e)
{
    Thread sampleThread = new Thread(delegate()
    {
        // Invoke your control like this
        this.statusStrip1.Invoke(new MethodInvoker(delegate()
        {
            timer1.Start();
        }));
    });
    sampleThread.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    MessageBox.Show("I just ticked!");
}
6
321X

System.Windows.Forms.Timer fonctionne dans une application à un seul thread.

Vérifiez ce lien:

Remarques dit:

Un minuteur est utilisé pour déclencher un événement à Intervalles définis par l'utilisateur. Ce temporisateur Windows Est conçu pour un environnement À un seul thread, dans lequel les threads UI Sont utilisés pour effectuer le traitement de . Il faut que le code de l'utilisateur Dispose d'une pompe de messagerie de l'interface utilisateur disponible Et qu'il fonctionne toujours à partir du même fil Ou que l'appel soit acheminé sur un autre thread .

Lisez-en plus à la section "Remarques" et vous découvrirez que Microsoft vous recommande d'utiliser cette minuterie pour la synchroniser avec le fil de l'interface utilisateur.

3

Je voudrais utiliser un BackgroundWorker (au lieu d'un raw thread). Le fil principal s'abonnerait à l'événement de RunWorkerCompleted du travailleur : l'événement se déclenche dans votre fil principal à la fin du fil. Utilisez ce gestionnaire d'événements pour redémarrer votre minuterie.

0
Serge Wautier