ใช้Timerต่างเครื่อง ให้ผลลัพธ์แตกต่างกัน แก้ไขอย่างไร
ผมทำโปรเจคที่ต้องรับสัญญาณข้อมูลมาจากSerial Port ซึ่งข้อมูลจะถูกส่งมาทุกๆ0.5วินาที
โดยอาศัยอีเวนท์ DataReceiveของSerialPort ซึ่งตามที่ผมเข้าใจ คือ มันมีThreadในตัวมันเอง
ดังนั้น จึงไม่เกิดปัญหาใดๆ โปรแกรมสามารถเข้าอีเวนท์ DataReceive แบบRealtimeตามจังหวะของข้อมูลที่ได้รับจากSerial Port
แต่พอผมต้องการนำค่าที่ได้ไปSet ให้textboxบนหน้าจอ ปรากฏว่า มันerror เพราะว่าหน้าจอมันใช้Threadหลัก
พอใช้Timer.Tickerเข้ามาช่วยในการเซ็ทให้textboxบนหน้าจอทุก0.5วินาที (Interval = 500)
ผลปรากฏว่า เมื่อนำไปใช้กับเครื่องUser มันTickช้ากว่าที่กำหนด Delayประมาณ3วินาทีหลังจากที่รับค่าจากอีเวนท์ DataReceive
ทั้งๆที่ตอนรันบนเครื่องที่ใช้เขียนโปรแกรมมันไม่มีปัญหา จึงสันนิษฐานว่า เพราะเครื่องของUser สเปคค่อนข้างต่ำ จึงส่งผลกับTimer
จึงอยากสอบถามว่า พอจะมีทางแก้อย่างไรสำหรับกรณีนี้ จะทำยังไงให้Timerของสองเครื่องมันให้ผลลัพธ์แบบเดียวกัน
และจะรู้ได้อย่างไรว่า แต่ละเครื่องสามารถTickที่Intervalต่ำสุดเท่าไหร่
-------
[RESOLVED]----------------------------------------------------------------------------
ขออนุญาติEdit เพื่อใส่Resolvedนะครับ เปลี่ยนจากTimerไปใช้Delegateแทน ตามคำแนะนำของ ท่าน คห.3 และ 4
โค้ดที่ใช้ ประมาณนี้
Delegate Sub SetTextCallback(ByVal needValue As String)
Private Sub SetText(ByVal needValuet As String)
If Me.textBox.InvokeRequired Then
Dim dlg As New SetTextCallback(AddressOf SetText)
Me.Invoke(dlg, New Object() {needValue})
Else
Me.textBox.Text = needValue
End If
End Sub
ใช้Timerต่างเครื่อง ให้ผลลัพธ์แตกต่างกัน แก้ไขอย่างไร
ผมทำโปรเจคที่ต้องรับสัญญาณข้อมูลมาจากSerial Port ซึ่งข้อมูลจะถูกส่งมาทุกๆ0.5วินาที
โดยอาศัยอีเวนท์ DataReceiveของSerialPort ซึ่งตามที่ผมเข้าใจ คือ มันมีThreadในตัวมันเอง
ดังนั้น จึงไม่เกิดปัญหาใดๆ โปรแกรมสามารถเข้าอีเวนท์ DataReceive แบบRealtimeตามจังหวะของข้อมูลที่ได้รับจากSerial Port
แต่พอผมต้องการนำค่าที่ได้ไปSet ให้textboxบนหน้าจอ ปรากฏว่า มันerror เพราะว่าหน้าจอมันใช้Threadหลัก
พอใช้Timer.Tickerเข้ามาช่วยในการเซ็ทให้textboxบนหน้าจอทุก0.5วินาที (Interval = 500)
ผลปรากฏว่า เมื่อนำไปใช้กับเครื่องUser มันTickช้ากว่าที่กำหนด Delayประมาณ3วินาทีหลังจากที่รับค่าจากอีเวนท์ DataReceive
ทั้งๆที่ตอนรันบนเครื่องที่ใช้เขียนโปรแกรมมันไม่มีปัญหา จึงสันนิษฐานว่า เพราะเครื่องของUser สเปคค่อนข้างต่ำ จึงส่งผลกับTimer
จึงอยากสอบถามว่า พอจะมีทางแก้อย่างไรสำหรับกรณีนี้ จะทำยังไงให้Timerของสองเครื่องมันให้ผลลัพธ์แบบเดียวกัน
และจะรู้ได้อย่างไรว่า แต่ละเครื่องสามารถTickที่Intervalต่ำสุดเท่าไหร่
-------[RESOLVED]----------------------------------------------------------------------------
ขออนุญาติEdit เพื่อใส่Resolvedนะครับ เปลี่ยนจากTimerไปใช้Delegateแทน ตามคำแนะนำของ ท่าน คห.3 และ 4
โค้ดที่ใช้ ประมาณนี้
Delegate Sub SetTextCallback(ByVal needValue As String)
Private Sub SetText(ByVal needValuet As String)
If Me.textBox.InvokeRequired Then
Dim dlg As New SetTextCallback(AddressOf SetText)
Me.Invoke(dlg, New Object() {needValue})
Else
Me.textBox.Text = needValue
End If
End Sub