2016-09-01 8 views
0

私は、DAQシステムが約1kHzでデータをサンプリングし、DataTableに書き込むアプリケーションがあります。DatatableのIndexOutOfRangeException

以下のコードブロックは、データテーブルにデータを追加するコードの一部を示しています。

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イベントを発生させます。

別のクラスがこのイベントをリッスンし、グラフを更新します。これはほとんどの場合よく機能しますが、時にはデータテーブルから読み込むときにIndexOutOfRangeExceptionが発生することがあります。

同期とは何かを持っていることはかなり明白であるが、私はまだ問題になる可能性があります正確に何を考え出したていません。 コードを見ると、インデックス「i」は本当に範囲外に出ることはできません。思い付いた ひとつのアイデアは、ループのため、それが作成されると同時に最後の行に到達した場合、私はちょうど

For i As Integer = s.Points.Count To sender.tblTimeLoadData.Count - 2 

にループ用アップデートしてみてくださいまたは多分そこにあることができるように、私は問題があるかもしれないということです私が予見した何か他のもの!

+2

エラーを特定してデバッグモードになっているので、よく見ています。 's.Points.Count'と' sender.tblTimeLoadData.Count'の値は何ですか?そして行の数と比較されますか? –

+1

[IndexOutOfRangeExceptionとは何ですか?そしてそれを修正する方法は?](http://stackoverflow.com/questions/20940979/what-is-indexoutofrangeexception-and-how-do-i-fix-it) –

+0

奇妙なことに、デバッガをチェックインすると、 '私はsender.tblTimeLoadData.Count - 1より大きいことはありません。 – LinusN

答えて

0

VBは、forループの "To"部分をメモリに保持します。

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 

か、適切にすべてをsynchlockながらも間/ラインと行(I)ラインの場合、アイテムが削除される可能性がありますので。

また、UIを更新するためのタイマーがある場合は、あなたはそれからすべてのビジネスルールを削除することを検討する必要があります。 UI上で何かをする前に、dsに適切なデータポイントが設定されているかどうか確認してください。

+0

DataTableから行が削除されることはありません。したがって、FORループは問題ではありません。 DAQシステムからデータを受信して​​いる間にUIを「ライブ」に更新したいとします。タイマーイベントハンドラの唯一の機能は、データテーブルからOxyPlotチャートシリーズにデータをコピーすることです。 – LinusN

+0

@ LinusN tblTimeLoadDataは、ループを開始したときの行数が明らかに少なくなっています。一部の行が削除されました。あなたの.Countが何とかあなたの.Rows.Countと異なる場合を除き、 –

+0

行は削除されません。それが私を混乱させている。 – LinusN

関連する問題