我有一个应用程序,DAQ系统以大约1 kHz的频率对数据进行采样,然后写入DataTable。
下面的代码块显示了将数据添加到数据表的部分代码。
Public Sub AddTimeLoadData(DateTime As DateTime, DataPointNo As Integer, ClampForceN As Double, _
TransverseForceN As Double, TransverseDispMm As Double, NumLoadCycles As Integer)
Try
_tblTimeLoadData.AddtblTimeLoadDataRow(NumLoadCycles, TransverseDispMm, TransverseForceN, ClampForceN, DataPointNo, DateTime, _TimeLoadTestRow)
_timRaiseDataAdded.Start()
Catch ex As Exception
Throw New Exception("Time/load data could not be added: " & ex.Message, ex)
End Try
End Sub
每次调用AddTimeLoadData时都不需要更新GUI,所以我开始使用System.Timers.Timer。在计时器的Elapsed事件中,我引发了TimeLoadDataUpdated事件。
在GUI中,另一个类正在侦听此事件,并更新图表。这在大多数情况下效果很好,但偶尔从数据表中读取时会出现IndexOutOfRangeException。
很明显,这与同步有关,但我还没有确切地知道可能是什么问题。 看看代码,索引'i'真的不能超出范围。 提出的一个想法是,如果for循环在创建的同时到达最后一行,我可能会遇到问题,所以我可以尝试将for循环更新为
For i As Integer = s.Points.Count To sender.tblTimeLoadData.Count - 2
或许还有其他我预见到的东西!?
答案 0 :(得分:0)
VB保留内存" To" for循环的一部分。
Dim c As Integer
c = 3
' This will print 0, 1, 2, 3
For i As Integer = 0 To c
c = 10
Console.WriteLine(i)
Next
您可能需要考虑使用while循环。
Dim c As Integer
c = 3
Dim i As Integer = 0
' Will print 0 to 9
While i < c
c = 10
Console.WriteLine(i)
i += 1
End While
或者正确地同步所有内容,因为即使在While / For行和Rows(i)行之间,也有可能删除该项目。
此外,如果您的计时器在那里更新UI。您应该考虑从中删除所有业务规则。在对UI执行任何操作之前,已经使用正确的数据点填充了ds。