2009-04-07 27 views
0

Pour accéder à une note sur mon formulaire, j'utilise le code suivantComment utiliser le filetage en toute sécurité pour une minuterie (Modifier les propriétés de la minuterie de différents fils)

public string TextValue 
    { 
     set 
     { 
      if (this.Memo.InvokeRequired) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        this.Memo.Text += value + "\n"; 
       }); 
      } 
      else 
      { 
       this.Memo.Text += value + "\n"; 
      } 
     } 
    } 

Je voudrais utiliser le même code pour activer/désactiver ma minuterie, mais il n'y a pas de propriété InvokeRequired pour un minuteur.

public int Timer 
    { 
     set 
     { 
      if (this.timer.InvokeRequired) //?? No such thing 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        if (value == 1) 
         this.timer.Enabled = true; 
        else 
         this.timer.Enabled = false; 
       }); 
      } 
      else 
      { 
       if (value == 1) 
        this.timer.Enabled = true; 
       else 
        this.timer.Enabled = false; 
      } 
     } 
    } 

Comment activer la minuterie à partir d'un thread différent?

Répondre

2

Est-ce que "this" est un objet de formulaire?

En supposant que vous avez créé l'objet Timer à l'aide du Concepteur de fiches, l'objet est créé par le même thread que celui qui a créé le formulaire. La vérification de la propriété InvokeRequired du formulaire vous indique donc la même chose.

+0

Oui, « ceci » est un objet de forme, mais je vous appelle cette fonction à partir d'un autre thread dans une section critique. –

+0

C'est bien. Tout le booléen InvokeRequired vous indique si CurrentThread == ThreadThatCreatedTheObject. Le thread qui a créé le formulaire est le même thread que celui qui a créé le timer, cela fonctionnera. –

+0

Non, ce n'est pas possible. Je ne peux pas activer la minuterie. –

1

Retirez la minuterie du code comme ci-dessous:

public int Timer 
{ 
    set 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke((MethodInvoker)delegate 
      { 
       if (value == 1) 
        this.timer.Enabled = true; 
       else 
        this.timer.Enabled = false; 
      }); 
     } 
     else 
     { 
      if (value == 1) 
       this.timer.Enabled = true; 
      else 
       this.timer.Enabled = false; 
     } 
    } 
} 
Questions connexes