我有一个计时器事件设置,我想通过从文本框中读取一个数字来改变计时器事件发生的频率。如果该框为“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;
}
如果有人知道我的错误,我们将不胜感激。
答案 0 :(得分: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;
}
确保在构造函数/ formload中调用CreateTimer
。此外,您现在可以在另一个按钮事件中停止计时器。使用_timer.Enabled = false;
答案 1 :(得分:2)
您总是创建一个新的计时器,永远不会停止旧计时器。当你将它从100“改变”到10时,你的100ms定时器仍然每100毫秒发射一次,所以每100ms两个定时器大约在同一时间发射。
您需要“记住”旧计时器,以便您可以停止它。或者,更好的是,只有一个计时器可以更改间隔。
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;
}
}
答案 2 :(得分: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);
现在,您只需要修改一个计时器,因为用户更改了文本框中的值。