2012-01-06 6 views
0

У меня есть приложение, которое использует один цикл для ввода текста в промежутки времени. Теперь я хочу, чтобы текст вводился с небольшими пробелами между каждым символом.Как запустить таймер внутри таймера?

Я пробовал этот код, но когда я запускаю таймеры, набирание продолжается во втором таймере. В моем первом случае нет пробелов, которые приурочили мои строки.

private List<char> charList = new List<char>(); 

public AutoTyper() 
{ 
    InitializeComponent(); 

    tmrInterval.Tick += new EventHandler(Interval); 
    tmrDelay.Tick += new EventHandler(Delay); 
    tmrSpace.Tick +=new EventHandler(charSpaces); 
    txtText.TextChanged += new EventHandler(TextChanged); 
    tbType.SelectedIndexChanged += new EventHandler(IndexChanged); 
} 

private void Interval(object sender, EventArgs e) 
{ 
    if (cbPause.Checked == false) 
    { 
     SendKeys.Send(txtText.Text + "{enter}"); 

     if (tbType.SelectedTab == tbInterval) 
     { 
      tmrInterval.Interval = int.Parse(nudInterval.Value.ToString()); 
     } 

     if (tbType.SelectedTab == tbRange) 
     { 
      tmrInterval.Interval = random.Next(int.Parse(nudMin.Value.ToString()), int.Parse(nudMax.Value.ToString())); 
     } 
    } 
    else if (cbPause.Checked == true) 
    { 
     tmrSpace.Enabled = true; 
    } 
} 

private void charSpaces(object sender, EventArgs e) 
{ 
    Random random = new Random(); 
    tmrSpace.Interval = random.Next(200, 400); 

    foreach (char character in charList) 
     SendKeys.Send(character.ToString()); 
    SendKeys.Send("{enter}"); 
} 

Редактировать, я попытался использовать версию спящего потока, поэтому я удалил время. Все, что у меня есть, идет, но он останавливает мой компьютер.

private void Interval(object sender, EventArgs e) 
{ 
    if (cbPause.Checked == false) 
    { 
     SendKeys.Send(txtText.Text + "{enter}"); 

     if (tbType.SelectedTab == tbInterval) 
     { 
      tmrInterval.Interval = int.Parse(nudInterval.Value.ToString()); 
     } 

     if (tbType.SelectedTab == tbRange) 
     { 
      tmrInterval.Interval = random.Next(
       int.Parse(nudMin.Value.ToString()), 
       int.Parse(nudMax.Value.ToString())); 
     } 
    } 
    else if (cbPause.Checked == true) 
    { 
     Random random = new Random(); 

     foreach (char character in charList) 
     { 
      SendKeys.Send(character.ToString()); 
      Thread.Sleep(random.Next(400, 500)); 
     } 

     SendKeys.Send("{enter}"); 
    } 
} 

ответ

0

Использование таймера намного лучше, чем приостановка потока. Вот как я это сделал:

private void Space(object sender, EventArgs e) 
    { 
     SendKeys.Send(txtText.Text.Substring(b++, 1)); 

     tmrSpace.Interval = random.Next(50, 150); 

     if (b == txtText.TextLength) 
     { 
      tmrSpace.Enabled = false; 
      SendKeys.Send("{enter}"); 
     } 
    } 

    private void Interval(object sender, EventArgs e) 
    { 
     if (cbPause.Checked) 
     { 
      b = 0; 

      tmrSpace.Interval = random.Next(50, 150); 
      tmrSpace.Enabled = true; 
     } 
     else 
     { 
      SendKeys.Send(txtText.Text + "{enter}"); 

      if (tbType.SelectedTab == tbRange) tmrInterval.Interval = random.Next(int.Parse(nudMin.Value.ToString()), int.Parse(nudMax.Value.ToString())); 
     } 
    } 
1

Если вам нужны короткие пробелы между каждым символом, я бы просто использовал Thread.Sleep().

Random r = new Random(); 

foreach (char character in charList)    
{ 
    SendKeys.Send(character.ToString()); 
    // sleep for between 200 and 400 milliseconds 
    Thread.Sleep(r.Next(200, 400)); 
} 

Использование таймера для чего-то вроде этого является излишним.

+0

Есть некоторые, кто будет использовать любое использование Thread.Sleep(). Тем не менее, я использовал его много раз, и мир не смог закончиться. –

+0

Не вижу, что проблема с таймером. Возможно, проголосовавший должен прокомментировать. Тем временем, однако ... +1! –

+1

@Norla: Таймеры обычно используются асинхронно. В этом случае требование является синхронной задержкой. Использование таймера для прерывания процесса таким образом кажется слишком сложным для меня. (И, очевидно, это было слишком сложно для ОП, потому что его/ее код - беспорядок, который явно не сработает!) –

Смежные вопросы