หยุดความอัปปรีย์ของ System.Timer แทนด้วย System.Threading.Timer

Post a reply

Smilies
:icon_plusone: :like: :plusone: :gfb: :-D :) :( :-o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :angry: :baa: :biggrin:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: หยุดความอัปปรีย์ของ System.Timer แทนด้วย System.Threading.Timer

หยุดความอัปปรีย์ของ System.Timer แทนด้วย System.Threading.Timer

by jataz2 » 03/11/2013 7:14 pm

เดิมใช้ System.Timer เป็นตัวนับเวลา เเล้วเจอปัญหาลุกค้าบอกว่า ทำไมเวลาไม่เดิน หยุดอยู่ที่ 0.00.00 ตลอดเลย ทั้งที่กำหนด ให้มัน Interval ทุกๆวินาทีเเล้วนิ กำหนดค่าทุกอย่างถูกแล้วด้วย

Code: Select all

 Private Sub TmrRecord_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TmrRecord.Tick
        Dim tmeRecord as Date = DateAdd(DateInterval.Second, 1, tmeRecord)
        Label1.Text = FormatDateTime(tmeRecord, DateFormat.LongTime)
    End Sub
event on Tick มันไม่ทำงาน งานของเราก็รวนๆไปกลายเป็นโปรเเกรมเม่อร์กากๆ ในสายตาลูกค้า
เเก้ไขด้วย System.Threading.Timer ครับมาดู code กันเลย

เป็น code ที่เบสิคมากๆครับ คือเอาไว้นับเวลา นับทีละ 1 วินาทีไปเรื่อยๆ ให้เวลาเดินไปเรื่อยๆโดยเเสดงผลลัพท์ไว้ที่ Label1

Code: Select all

Imports Microsoft.VisualBasic
Imports System
Imports System.Threading

Public Class Form2
    Private alarm As Threading.Timer
    Private tmeRecord As Date
    Private strSecound As String
    ReadOnly stateLock As New Object()

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.alarm = New Threading.Timer(AddressOf Tick, Nothing, CInt(1000), CInt(1000))

    End Sub

    Private Sub Tick(ByVal state As Object)
        tmeRecord = DateAdd(DateInterval.Second, 1, tmeRecord)
        SyncLock stateLock
            strSecound = FormatDateTime(tmeRecord, DateFormat.LongTime)
        End SyncLock
        AccessControl()
    End Sub

    Private Sub AccessControl()
        If Me.InvokeRequired Then
            Me.Invoke(New MethodInvoker(AddressOf AccessControl))
        Else
            Label1.Text = strSecound
        End If
    End Sub
    Private Sub btnStopTimer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.alarm.Change(Timeout.Infinite, Timeout.Infinite)
    End Sub

    Private Sub btnStartTimer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.alarm.Change(CInt(1000), CInt(1000))
    End Sub
End Class

Top