1

我有一个计时器事件设置,我想通过从文本框中读取一个数字来更改计时器事件发生的频率。如果该框是“10”并且您单击更新按钮,则该事件将每 10 毫秒触发一次,然后如果您更改为“100”并单击它,它将每 100 毫秒发生一次,依此类推。

然而,当我运行程序时,我可以加快事件频率(例如 100 毫秒到 10 毫秒),但我不能减慢它(例如 10 毫秒到 100 毫秒)。这是我单击时更改计时器的代码:

    private void TimerButton_Click(object sender, EventArgs e)
    {

        getTime = ImgTimeInterval.Text;
        bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
        label2.Text = isNumeric.ToString();
        if (isNumeric)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Enabled = false;
            timer.Interval = timerMS;
            timer.Elapsed += new ElapsedEventHandler(timerEvent);
            timer.AutoReset = true;
            timer.Enabled = true;
        }
    }

    public void timerEvent(object source, System.Timers.ElapsedEventArgs e)
    {
        label1.Text = counter.ToString();
        counter = (counter + 1) % 100;
    }

如果有人知道我可能做错了什么,将不胜感激。

4

3 回答 3

4

Timer这段代码的问题是,每次单击按钮时都会创建一个新代码。尝试在方法之外创建计时器。您认为它只会更快,但多个计时器会触发timerEvent

private System.Timers.Timer _timer;

private void CreateTimer()
{
    _timer = new System.Timers.Timer();
    _timer.Enabled = false;
    _timer.Interval = 100;  // default
    _timer.Elapsed += new ElapsedEventHandler(timerEvent);
    _timer.AutoReset = true;
    _timer.Enabled = true;    
}

private void TimerButton_Click(object sender, EventArgs e)
{
    bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
    label2.Text = isNumeric.ToString();
    if (isNumeric)
    {
        _timer.Interval = timerMS;
    }
}

public void timerEvent(object source, System.Timers.ElapsedEventArgs e)
{
    label1.Text = counter.ToString();
    counter = (counter + 1) % 100;
}

确保CreateTimer在构造函数/表单加载中调用了。您现在还可以在另一个按钮事件中停止计时器。和_timer.Enabled = false;

于 2013-11-06T19:08:41.977 回答
2

您总是在创建一个新计时器,而从不停止旧计时器。当您将其从 100 更改为 10 时,您的 100 毫秒计时器仍然每 100 毫秒触发一次,因此每 100 毫秒大约同时触发两个计时器。

您需要“记住”旧计时器,以便您可以停止它。或者,更好的是,只有一个计时器可以更改时间间隔。

private System.Timers.Timer timer = new System.Timers.Timer();
public Form1()
{
    timer.Enabled = false;
    timer.AutoReset = true;
    timer.Elapsed += timerEvent;
}

private void TimerButton_Click(object sender, EventArgs e)
{
    getTime = ImgTimeInterval.Text;
    bool isNumeric = int.TryParse(ImgTimeInterval.Text, out timerMS); //if number place number in timerMS
    label2.Text = isNumeric.ToString();
    if (isNumeric)
    {
        timer.Interval = timerMS;
        timer.Enabled = true;
    }
}
于 2013-11-06T19:09:41.350 回答
1

那么基本问题是你每次都在构建一个新的。制作一个私人计时器:

private System.Timers.Timer _timer = new System.Timers.Timer();

然后在单击按钮时对其进行修复:

if (isNumeric)
{
    _timer.Stop();
    _timer.Interval = timerMS;
    _timer.Start();
}

然后在 中.ctor,执行以下操作:

_timer.Elapsed += new ElapsedEventHandler(timerEvent);

现在您有一个计时器,您只需在用户更改文本框中的值时对其进行修改。

于 2013-11-06T19:09:54.870 回答