Как запустить Таймер внутри Таймера? - PullRequest
0 голосов
/ 07 января 2012

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

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

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}");
    }
}

Ответы [ 2 ]

1 голос
/ 07 января 2012

Если вы хотите короткие пробелы между каждым символом, я бы просто использовал 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 голосов
/ 08 января 2012

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

    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()));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...