2009-10-01 10 views
1

Hey les gars im essayant d'obtenir un simple bouton de masquage, ce que je veux timer1 à faire est de mash keys dans richtextbox1 pendant 30 secondes encore et encore, après 30 secondes Activer timer2, qui désactive la minuterie 1 et appuie une fois sur les touches de la zone de texte enrichi 2, puis attend 10 secondes et active à nouveau le minuteur 1.Intervalles de minuterie, Faire une minuterie arrêter une autre minuterie -

Im extremley nouveau à C# mais ive essayé d'utiliser minuterie 3 pour arrêter le chronomètre 2 et redémarrer le chronomètre 1 à nouveau et il vient de le gâcher soi-même. Le code ive essayé est ci-dessous. Toute aide aprécié ...

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      SendKeys.Send(richTextBox1.Text); 
      SendKeys.Send("{ENTER}"); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      timer1.Enabled = true; 
      timer2.Enabled = true; 
     } 

     private void timer2_Tick(object sender, EventArgs e) 
     { 
      SendKeys.Send(richTextBox2.Text); 
      SendKeys.Send("{ENTER}"); 
      timer1.Enabled = false; 
     } 

     private void timer3_Tick(object sender, EventArgs e) 
     { 
      timer1.Enabled = true; 
      timer2.Enabled = false; 
     } 

     private void richTextBox2_TextChanged(object sender, EventArgs e) 
     { 

     } 

     private void richTextBox1_TextChanged(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+0

Êtes-vous vraiment décidé à utiliser des minuteries pour cela? – JustLoren

+0

Non je ne suis pas fixé sur l'utilisation de timers seulement, je pensais juste que c'était la façon la plus simple de le faire. J'ai probablement tort, avez-vous des suggestions qui pourraient m'aider à faire cela? –

+0

Je pense que nous aurons besoin d'en savoir plus sur ce que le programme essaie d'accomplir. –

Répondre

1

Je suggère d'utiliser une seule minuterie, d'incrémenter un compteur d'état toutes les secondes et d'exécuter une base d'action sur l'état actuel.

public Form1() 
{ 
    this.InitializeComponent(); 

    // Just to illustrate - can be done in the designer. 
    this.timer.Interval = 1000; // One second. 
    this.timer.Enable = true; 
} 

private Int32 state = 0; 

private void timer_Tick(Object sender, EventArgs e) 
{ 
    if ((0 <= this.state) && (this.state < 30)) // Hit text box 1 30 times. 
    { 
     SendKeys.Send(this.richTextBox1.Text); 
     SendKeys.Send("{ENTER}"); 
    } 
    else if (this.state == 30) // Hit text box 2 once. 
    { 
     SendKeys.Send(this.richTextBox2.Text); 
     SendKeys.Send("{ENTER}"); 
    } 
    else if ((31 <= this.state) && (this.state < 40)) // Do nothing 9 times. 
    { 
     // Do nothing. 
    } 
    else 
    { 
     throw new InvalidOperationException(); // Unexpected state. 
    } 

    // Update state. 
    this.state = (this.state + 1) % 40; 
} 

La variante avec deux contrôles ascendants numériques.

public Form1() 
{ 
    this.InitializeComponent(); 

    // Just to illustrate - can be done in the designer. 
    this.timer.Interval = 1000; // One second. 
    this.timer.Enable = true; 
} 

private Int32 state = 0; 

private void timer_Tick(Object sender, EventArgs e) 
{ 
    Decimal n1 = this.numericUpDown1.Value; 
    Decimal n2 = this.numericUpDown2.Value; 

    if ((0 <= this.state) && (this.state < n1)) 
    { 
     SendKeys.Send(this.richTextBox1.Text); 
     SendKeys.Send("{ENTER}"); 
    } 
    else if (this.state == n1) 
    { 
     SendKeys.Send(this.richTextBox2.Text); 
     SendKeys.Send("{ENTER}"); 
    } 
    else if ((n1 <= this.state) && (this.state < n1 + n2)) 
    { 
     // Do nothing. 
    } 
    else 
    { 
     // Reset state to resolve race conditions. 
     this.state = 0; 
    } 

    // Update state. 
    this.state = (this.state + 1) % (n1 + n2); 
} 
+0

Salut merci pour ça, ça fonctionne presque comme je le veux. En utilisant la méthode ci-dessus, il ne touche qu'une seule fois les clés dans richtexbox1, puis attend 30 secondes et frappe les touches dans textbox2. J'en ai besoin pour appuyer sur les touches de textbox1 encore et encore pendant 30 secondes, qu'est-ce que j'ajouterais pour faire ça? –

+0

Quelle fréquence voulez-vous pendant les 30 secondes? –

+0

toutes les secondes devrait être bien. Mais il doit être seulement pour le texte dans la zone de texte 1. –

1

Si timer3 fonctionne en permanence, ne pas commencer timer1 et arrêter timer2 à des moments imprévisibles, sans crier gare?

IOW, qu'est-ce qui démarre et arrête timer3? Comme JustLoren l'a souligné, il pourrait y avoir une façon plus propre de le faire. Peut-être un seul événement de minuterie et une logique de contrôle et des drapeaux, plutôt que d'essayer de jongler avec trois minuteurs.

+0

Ouais, en utilisant beaucoup de minuteurs est généralement un signe que le code peut être grandement simplifié. –

Questions connexes