[問題] Timer.Tick 事件重複載入運算的問題(有解)

看板C_Sharp (C#)作者 (Byron)時間12年前 (2013/08/20 16:40), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串1/1
功能需求: 設定一個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)

08/20 17:25, , 1F
InitializeTimer()移到Form_Load裡
08/20 17:25, 1F

08/20 17:28, , 2F
請用 -= 拆除,例如:
08/20 17:28, 2F

08/20 17:29, , 3F
timer1.Tick -= new EventHandler(Timer1_Tick);
08/20 17:29, 3F

08/20 18:25, , 4F
elba大正解,剛在別的地方找到答案,回來發現這邊也有^^
08/20 18:25, 4F
經好心人提示,找到解決辦法了,在此提供答案: 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)
文章代碼(AID): #1I4ojaHh (C_Sharp)
文章代碼(AID): #1I4ojaHh (C_Sharp)