作者ravelive (Byron)
看板C_Sharp
标题[问题] Timer.Tick 事件重复载入运算的问题,SOS
时间Tue Aug 20 16:40:00 2013
功能需求: 设定一个T1值,未来要用来指定datatable的列数用,而读取的周期靠timer设
定,timer1.Interval越短则读资料频率越快,
因此先简单设定测试环境:
一个timer,用来设定频率
一个label,用来显示T1值
一个Button,用来控制timer开始与停止
程式码如下:
public int T1 = 0; //T1初始值为0
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "Stop") //暂停功能
{
button1.Text = "Start";
timer1.Enabled = false;
}
else //开始功能
{
InitializeTimer(); //初始化timer1设定
button1.Text = "Stop";
timer1.Enabled = true;
}
}
private void InitializeTimer()
// Call this procedure when the application starts.
{
timer1.Interval = 500; //时间间隔
timer1.Tick += new EventHandler(Timer1_Tick);
//每过一个interval就呼叫一次事件
}
private void Timer1_Tick(object Sender, EventArgs e)
//处理每过一个timer1.Interval被呼叫的事件
{
T1 ++;
label1.Text = "T1值目前为:" + T1.ToString();
//每过一个interval, 会显示 0 1 2 3 ....
}
现在遇到的问题是,当我第一次按下去之後,我的label 很正确的显示 0 1 2 3 ...,接
着我按暂停,
然後当我再度按下开始的时候, T++被重复载入了 , label会变成 5 7 9 ...,变成每
次加2
如果在暂停一次再开始,T++被重复载入第三次,label 12 15 18...,,变成每次加3
因为我需要即时检视目前加到多少,而这个T1值需要被储存,纪录目前累积的值,
而需要在tick发生时自动T1+1,
我尝试过把timer1.Tick += new EventHandler(Timer1_Tick); 从InitializeTimer()拉
出来到按开始钮的那边,还是一样的结果,
所以问题卡在一个很矛盾的地方,我需要timer帮我累加、即时显示,又不希望它记忆我
累加的方法(T++)
因此我想来想去实在想不到一个可以纪录、又正确即时显示,然後暂停过後不会重覆载入
T++的方法,还恳请版上高手解答了!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.133.70.53
※ 编辑: ravelive 来自: 140.133.70.53 (08/20 16:41)
※ 编辑: ravelive 来自: 140.133.70.53 (08/20 16:44)
1F:→ elba:InitializeTimer()移到Form_Load里 08/20 17:25
2F:推 TeemingVoid:请用 -= 拆除,例如: 08/20 17:28
3F:→ TeemingVoid:timer1.Tick -= new EventHandler(Timer1_Tick); 08/20 17:29
4F:→ ravelive:elba大正解,刚在别的地方找到答案,回来发现这边也有^^ 08/20 18:25
经好心人提示,找到解决办法了,在此提供答案:
InitializeTimer();这条移到form1下只宣告一次,
public Form1()
{
InitializeComponent();
InitializeTimer();
}
并且要将初始值改为:
private void InitializeTimer() //处理每一个timer实作的属性栏位 // Call this
procedure when the application starts.
{
timer1.Interval = 100; //时间间隔: 1000代表一秒
timer1.Enabled = false; //一开始要是false,不然一执行马上就开始跑值
timer1.Tick += new EventHandler(Timer1_Tick);
}
并且把事件修改为:
public void Timer1_Tick(object Sender, EventArgs e) //处理每过一个
timer1.Interval被呼叫的事件
{
T1 ++;
label4.Text = "T1值目前为:" + T1.ToString();
}
如此就可以正常跑了!! 原来我想破头都想不出所以然的症结,
原来是发生在初始化上。
※ 编辑: ravelive 来自: 140.133.70.53 (08/20 18:26)