Использовать таймер со случайным интервалом - PullRequest
1 голос
/ 06 января 2012

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

using System;
using System.Windows.Forms;

namespace Auto_Typer
{
    public partial class AutoTyper : Form
    {
        public AutoTyper()
        {
            InitializeComponent();

            tmrInterval.Tick += new EventHandler(Interval);

            txtInterval.TextChanged += new EventHandler(TextChanged);
            txtMin.TextChanged += new EventHandler(TextChanged);
            txtMax.TextChanged += new EventHandler(TextChanged);
        }

        private void TextChanged(object sender, EventArgs e)
        {
            if (int.Parse(txtInterval.Text) < 1 || int.Parse(txtMin.Text) < 1 || int.Parse(txtMax.Text) < 1)
            {
                txtInterval.Text = "1";
                txtMin.Text = "1";
                txtMax.Text = "1";
            }
            else if (int.Parse(txtInterval.Text) > 100)
            {
                txtInterval.Text = "100";
                txtMin.Text = "100";
                txtMax.Text = "100";
            }
            else if (int.Parse(txtMin.Text) >= int.Parse(txtMax.Text))
            {
                txtMax.Text = (int.Parse(txtMin.Text) + 1).ToString();
            }
        }

        void Interval(object sender, EventArgs e)
        {
            SendKeys.Send(txtText.Text + ", " + tmrInterval.Interval + "{enter}");
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (tbType.SelectedTab == tbInterval)
            {
                tmrInterval.Interval = int.Parse(txtInterval.Text) * 1000;
                tmrInterval.Enabled = true;
            }

            if (tbType.SelectedTab == tbRange)
            {
                Random random = new Random();

                tmrInterval.Interval = (random.Next(int.Parse(txtMin.Text), int.Parse(txtMax.Text)) * 1000);
                tmrInterval.Enabled = true;
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            tmrInterval.Enabled = false;
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 06 января 2012

Я бы предложил перенести вызов «new Random ()» в ваш инициализатор, а затем просто вызывать Random.Next () каждый раз, когда вам нужно новое случайное число.

больше информации о Random () в: http://msdn.microsoft.com/en-us/library/h343ddh9.aspx

Случайное не совсем случайное, это псевдослучайное. Это означает, что при одинаковом начальном семени (аргумент, переданный экземпляру Random), последующие вызовы Random.Next () каждый раз будут возвращать одну и ту же последовательность значений. Хорошая новость (спасибо, phoog) заключается в том, что конструктор по умолчанию (без аргументов) автоматически использует основанное на времени начальное число.

2 голосов
/ 06 января 2012

Просто измените интервал в методе обратного вызова для случайно меняющегося интервала:

private Random random = new Random();

void Interval(object sender, EventArgs e)
{
    tmrInterval.Interval = (random.Next(int.Parse(txtMin.Text), int.Parse(txtMax.Text)) * 1000);
    SendKeys.Send(txtText.Text + ", " + tmrInterval.Interval + "{enter}");
}

А также (как и выше) сделайте экземпляр Random полем члена вашего класса, чтобы у вас не былообновлять его каждый раз (что может вызвать проблемы при вызове в очень быстром порядке).

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

Прямо сейчас экземпляр Random создается каждый раз, когда нажимается кнопка, потому что он является локальным для обработчика.Чтобы сохранить это между нажатиями, вы должны сделать это полем.-

private Random _random = new Random();

Теперь обработчик кликов может получить следующее случайное значение из поля

if (tbType.SelectedTab == tbRange)
{
    tmrInterval.Interval = (_random.Next(int.Parse(txtMin.Text), int.Parse(txtMax.Text)) * 1000);
    tmrInterval.Enabled = true;
}
...