none
(VB.NET 2005)求助碼表計時器問題 RRS feed

  • 問題

  • 各位大大好:

    我想請問各位大大有誰能告訴我我的碼表有哪邊寫的有問題呀,我從網路上找到,把他考下來修改一下,發現它可以執行可是我有對過時,結果都不準,會延遲幾秒鐘,是怎嚜回事,請大大告訴我一下,或是各位大大有什麼好的寫法,能告訴我媽。在此會非常感謝:

     

    Process:

    設置Button1(Start)、Button2(Stop)、Button3(Restart)

    設置Label1(lblH)、Label2(lblM)、Label3(lblS)、Label4(lblMS):分別代表碼表時間H:MTongue Tied:"

    程式如下:

    Public Class Form1
        Private Shared myTimer As New System.Windows.Forms.Timer()
        Private Shared timeH As Integer = 0 '小時計數用
        Private Shared timeM As Integer = 0 '分鐘計數用
        Private Shared timeS As Integer = 0 '秒計數用
        Private Shared timeMS As Integer = 0 '微秒計數用

     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Timer1.Enabled = True
            Me.Timer1.Interval = 1 '單位為微秒
            Me.Timer1.Start()
            ' myTimer.Enabled = True
        End Sub

     

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            timeMS = timeMS + 1
            If timeMS = 100 Then
                timeS = timeS + 1
                lblMS.Text = 0
                timeMS = 0
            End If

     

            If timeS >= 60 Then
                timeM = timeM + 1
                lblS.Text = 0
                lblMS.Text = 0
                timeMS = 0
                timeS = 0
            End If

     

            If timeM >= 60 Then
                timeH = timeH + 1
                lblM.Text = 0
                lblS.Text = 0
                lblMS.Text = 0
                timeMS = 0
                timeS = 0
                timeM = 0
            End If

     

            lblMS.Text = timeMS
            lblS.Text = timeS
            lblM.Text = timeM
            lblH.Text = timeH
        End Sub


        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.Timer1.Stop() 'stop按鈕
        End Sub

       

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            'Reset按鈕事件()
            Me.Timer1.Enabled = False
            lblMS.Text = "0"
            lblS.Text = "0"
            lblM.Text = "0"
            lblH.Text = "0"
            timeH = 0
            timeM = 0
            timeS = 0
            timeMS = 0
        End Sub
    End Class

    2008年11月2日 上午 04:56

解答

所有回覆

  • 用絕對時間相減。

     

    例如:

    Code Snippet

    Private startTime As Date = DateTime.Now

    ...

    Debug.Print((DateTime.Now - StartTime).ToString("HH:mm:ss.fffffff")

     

     

    原因:

    1. Windows NT 時間解析度為 10 ms

    搜尋既有討論 10 ms

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=10+ms&localechoice=31748&SiteID=14&searchscope=forumscope&ForumID=232

     

    2. 時間事件 WM_TIMER 並不能確保每次都發生,若系統忙碌時會被拋棄

    搜尋既有討論 WM_TIMER

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=WM_TIMER&localechoice=31748&SiteID=14&searchscope=allforums

     

    2008年11月2日 上午 07:29
  •  

    這位大大,不好意思我還是不太懂你的意思。

     

    我用迴圈的方式跑會因為系統的延遲產生這樣的誤差,但是你說怎嚜用絕對時間去相減我還是不太懂,

    你上面給的程式碼用法我要怎嚜樣加入我的程式中壓,不好意思小弟是初學者有點不懂,請你見諒

    2008年11月2日 上午 09:08
  • 這行寫錯:

    Debug.Print((DateTime.Now - StartTime).ToString("HH:mmTongue Tieds.fffffff")

     

    應該是:

    Debug.Print((DateTime.Now - StartTime).ToString())

     

     

    至於怎樣置換,你先試試看,把你測試程式碼寫出來瞧瞧再說。有努力有討論。

    2008年11月2日 下午 12:01
  • Public Class Form1

        Private startTime As Date = DateTime.Now
        Private Shared myTimer As New System.Windows.Forms.Timer()
        Private Shared time As Date


        ' Private Shared same As Integer = 0 '紀錄同一台車
        Dim sDT As String '取時間
        Private Shared now As Integer '觸發時間
        Private TAG_UID As String
        Private con As connect


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            startTime = DateTime.Now

            Me.Timer1.Enabled = True
            Me.Timer1.Interval = 1 '單位為微秒
            Me.Timer1.Start()
            ' myTimer.Enabled = True

        End Sub

     

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            time = ((DateTime.Now - startTime).ToString)

            usedtime.Text = time

        End Sub


        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.Timer1.Stop() 'stop按鈕
        End Sub

     

        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            'Reset按鈕事件()
            Me.Timer1.Enabled = False
            usedtime.Text = ""

     

        End Sub

     

    我大概這樣寫,但是發現他小時的部分亦開始就是12 這是怎麼回事?

    2011年1月4日 下午 12:33
  • 請先解釋你哪個變數預期值為何、輸出值為何?

    你在哪個程式碼片段發現你的變數輸出不符合預期。


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

     

    則  usedtime.Text 會輸出 00:00:00 往上增加

    而實際他卻輸出  上午 12:00:00 往上增加

    怎會多一個"上午"  以及12     可能是他的本質我還沒搞清楚

    還有,有辦法精細到微秒嗎?

    還有 上面附的連結全死光了!
    2011年1月5日 下午 04:35
  • ...

    usedtime.Text = time.ToString("yyyy/MM/dd HH:mm:ss.fffffff")

     

    那是論壇改版前的舊網址。


    T.L. Cheng
    2011年1月6日 下午 01:10
    版主
  • 謝謝 已經測試成功了!
    2011年1月6日 下午 06:09