โดย jataz2 » 03/11/2013 7:14 pm
เดิมใช้ System.Timer เป็นตัวนับเวลา เเล้วเจอปัญหาลุกค้าบอกว่า ทำไมเวลาไม่เดิน หยุดอยู่ที่ 0.00.00 ตลอดเลย ทั้งที่กำหนด ให้มัน Interval ทุกๆวินาทีเเล้วนิ กำหนดค่าทุกอย่างถูกแล้วด้วย
โค้ด: เลือกทั้งหมด
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
โค้ด: เลือกทั้งหมด
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
เดิมใช้ System.Timer เป็นตัวนับเวลา เเล้วเจอปัญหาลุกค้าบอกว่า ทำไมเวลาไม่เดิน หยุดอยู่ที่ 0.00.00 ตลอดเลย ทั้งที่กำหนด ให้มัน Interval ทุกๆวินาทีเเล้วนิ กำหนดค่าทุกอย่างถูกแล้วด้วย
[code] 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[/code]
event on Tick มันไม่ทำงาน งานของเราก็รวนๆไปกลายเป็นโปรเเกรมเม่อร์กากๆ ในสายตาลูกค้า
เเก้ไขด้วย [b][color=#008000]System.Threading.Timer[/color][/b] ครับมาดู code กันเลย
เป็น code ที่เบสิคมากๆครับ คือเอาไว้นับเวลา นับทีละ 1 วินาทีไปเรื่อยๆ ให้เวลาเดินไปเรื่อยๆโดยเเสดงผลลัพท์ไว้ที่ Label1
[code]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[/code]