簡體   English   中英

C#計時器,我可以加快但不能減慢速度

[英]C# timer I can speed up but not slow down

我有一個計時器事件設置,我想通過從文本框中讀取一個數字來更改計時器事件發生的頻率。 如果該框為“ 10”,然后單擊“更新”按鈕,則事件將每10ms觸發一次;然后,如果更改為“ 100”並單擊,則事件將每100ms觸發一次,依此類推。

但是,當我運行程序時,我可以加快事件頻率(例如100ms至10ms),但不能降低事件頻率(例如10ms至100ms)。 這是我單擊時更改計時器的代碼片段:

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

如果有人知道我在做什么錯,將不勝感激。

此代碼的問題是,每次單擊按鈕時,您都會創建一個新的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被稱為在構造函數/ formload。 您現在也可以在另一個按鈕事件中停止計時器。 使用_timer.Enabled = false;

您總是在創建一個新計時器,而從不停止舊計時器。 當您將其從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;
    }
}

好吧,基本問題是您每次都在構建一個新的。 設置一個私人計時器:

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

然后在單擊按鈕時對其進行修復:

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

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

_timer.Elapsed += new ElapsedEventHandler(timerEvent);

現在,只有一個計時器,您可以在用戶更改文本框中的值時對其進行修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM