none
Timer重設問題 RRS feed

  • 問題

  • 請問各位:
    如果我想在某事發生後,讓timer的計數值重設
    例如interval設5秒,計數值為3秒後某事件發生後把計數值歸0

    我查了一下MSDN寫道
    如果間隔是在 Timer 啟動後才設定,計數將重設。例如,如果您將間隔設定為 5 秒,然後將 Enabled 屬性設定為 true,計數將會在時間設定 Enabled 後啟動。如果您在計數為 3 秒時將間隔重設為 10 秒,當 Enabled 設定為 true 後的 13 秒,將首次引發 Elapsed 事件。
    看起來不大像是我要的功能,請問該怎麼做呢??
    感謝各位
    2009年10月28日 上午 08:59

解答

所有回覆

  • 看起來是你要的沒錯......
    你在「某事件」的處理常式內把Interval再設為5000試試
    2009年10月28日 上午 09:10
  • Hi! 你的意思是這樣嗎?

            int TimerCount = 0;
            private void Form1_Load(object sender, EventArgs e)
            {
                this.timer1.Interval = 1000;
                this.timer1.Enabled = true;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                // Button Click 後,重設計數器
                TimerCount = 0;
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                TimerCount++;
            }

    Windows 7 多點觸控設計大賽
    2009年10月28日 上午 09:12
    版主
  • Timer先disable,然後重設interval,再enable就沒這個問題.
    • 已標示為解答 Jude13 2009年10月28日 上午 09:47
    2009年10月28日 上午 09:13
  • 謝謝各位的回覆
    抱歉我沒有表達清楚,我所謂的計數是指如果我interval設5秒
    當timer start過了3秒發生某事件(interval不變)後秒數歸0
    timer重新倒數5秒。

    所以我必須要在事件發生後先disable timer在enable,時間才會重計囉??
    2009年10月28日 上午 09:19
  • 是,如programlin大所說的,大概像這樣
                timer1.Enabled = false;
                timer1.Interval = 5000;
                timer1.Enabled = true;

    2009年10月28日 上午 09:34
  • 我了解了,謝謝各位

    2009年10月28日 上午 09:48
  • 不要過度信賴 Timer ,Timer 只是讓系統定時對這個視窗發出 WM_TIMER

    系統忙碌或目標視窗忙碌時,會掉事件。

    用時間相減的函數判斷,就算掉事件,下次觸發時還能動。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月28日 上午 10:07
  • 不要過度信賴 Timer ,Timer 只是讓系統定時對這個視窗發出 WM_TIMER

    系統忙碌或目標視窗忙碌時,會掉事件。

    用時間相減的函數判斷,就算掉事件,下次觸發時還能動。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    使用Environment.TickCount來做相減拚斷+無窮迴圈可以嗎? (新執行序)

    只是一個小小的參考:

    int LastTime;
    while (true)
    {
    if (Environment.TickCount - LastTime >= 毫秒數)
    {
    'To do...
    LastTime=Environment.TickCount;
    }
    }
    2009年10月28日 上午 10:17
  • 這樣會很吃 CPU 效能

    若需要使用更高解析度的時間處理,例如小於 ms,就要改用 QueryPerformanceFrequency / QueryPerformanceCounter

    可看一下這篇內容跟回應:
    http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/03/24/657.aspx

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月28日 上午 10:31
  • 這樣會很吃 CPU 效能

    若需要使用更高解析度的時間處理,例如小於 ms,就要改用 QueryPerformanceFrequency / QueryPerformanceCounter

    可看一下這篇內容跟回應:
    http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/03/24/657.aspx

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    嗯..在下目前就有這個問題..很吃CPU..
    是否可提供不吃CPU的方法?
    目前我是在新執行序裡的無窮迴圈末端讓他睡個100ms..但這樣會嚴重降低準確度
    2009年10月28日 上午 10:39
  • 你可以看看這篇:
    http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1640.entry

    若是配合華碩主機板,用 Sleep(1) 可 +- 1ms

    非華碩主機板加看這篇:
    http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/03/29/673.aspx
    透過多媒體函數縮短 Sleep(1) 的時間到 1ms。
    註:多媒體函數執行時間比較久


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月28日 上午 10:58
  • 補充:
    可以睡 1ms 的主機板,就可以直接睡 100ms ,誤差也是在 1ms 內。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月28日 上午 11:33
  • 補充:
    可以睡 1ms 的主機板,就可以直接睡 100ms ,誤差也是在 1ms 內。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    該文章末端有提到
    「不過,使用timeBeginPeriod時要注意,原則上調動它會造成系統不必要的負擔,記得不用了馬上timeEndPeriod恢復原狀。」

    那..如果是在while (true) 的無窮迴圈怎麼辦?
    在{ }上方和下方各插timeBeginPeriod和timeEndPeriod?
    很抱歉.. 各位大大,我是個新手,如有敘述不清請不吝指教!
    2009年10月28日 下午 12:25
  • 不知道你的設計邏輯,不能確定。

    你可以在你程式開始、結束去呼叫,或是計時器的啟動與終結時呼叫。
    若是特定目地,建議你直接買一台華碩主機板的電腦跑,硬體直接支援比較省事,而且也不會增加資源損耗。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月28日 下午 12:35