ここで達成しようとしているのは、あるフォルダーからコピーして一時フォルダーに入れる CSV ファイルからデータを取得することです (元のファイルを改ざんしないようにします)。
次に、CSV ファイルからすべてのデータを読み込み、Oxyplot の散布シリーズを使用してグラフに最後の 2000 データ ポイントをプロットします (200 ミリ秒ごとに新しいデータをチェックしたいので、Dispatcher Timer を使用しました)。私が抱えている問題は、プロットの最初の数回の更新が見栄えがよく、希望どおりに正確にプロットされることです...ただし、おそらく12回の更新の後、グラフが更新されないか、更新が非常に遅くなり、UIが無反応。
以下は、プロジェクトのこの部分の私のコードです...
public MainWindow()
{
viewModel = new View_Model.MainWindowModel();
DataContext = viewModel;
CompositionTarget.Rendering += CompositionTargetRendering;
InitializeComponent();
}
private void AutoUpdateGraph() //begins when a check box IsChecked = true
{
sw.Start();
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 200);
dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
SleeveData sd = new SleeveData(); //class to deal with the data
FileManagement fm = new FileManagement(); //class to manage the files
string date = fm.GetDate(); //get the current date to use in finding the
//most recent CSV file
_newPath = fm.InitialFileSetup(date); //create a new path for the temp file
fm.RewriteFile(_newPath); //write the temp file to the temp path
if (fm.IsFileLocked(_newPath) == false) //checking if the file is being written to
{
IEnumerable<SleeveData> newSD = sd.GetMostRecentCSVData(_newPath); //getting the latest data from the temp file
viewModel.LoadData(newSD); //updating the data on the graph
}
}
そして、これが MainWindowModel の LoadData メソッドです...
public void LoadData(IEnumerable<SleeveData> newData)
{
var scatterSeries1 = new OxyPlot.Series.ScatterSeries
{
MarkerSize = 3,
Title = string.Format("Sleeve Data"),
};
int j = 0;
var zeroBuffer = new List<float>(new float[2000]);
var fDiaDataBuffer = zeroBuffer.Concat((newData.Select(x => x.fDiameter).ToList())).ToList();
var iDiaDataBuffer = zeroBuffer.Concat((newData.Select(x => x.IDiaMax).ToList())).ToList();
for (int i = fDiaDataBuffer.Count - 2000; i <= fDiaDataBuffer.Count - 1; i++)
{
scatterSeries1.Points.Add(new ScatterPoint(j, fDiaDataBuffer[i]));
j++;
}
PlotModel.Series.Clear();
PlotModel.Series.Add(scatterSeries1);
}
最新の 2000 ポイントを取得してグラフに追加するために、いくつかのファンキーなことをしています。
多分私はバックグラウンドワーカーを考慮する必要がありますか?
私はこれについてすべて間違っているかもしれません。もしそうなら、どちらの方向に進むべきか知りたいです! 私は、これほど大規模で、リアルタイムで実行する必要があるプロジェクトのコーディングにかなり慣れていません。私に気楽に行ってください:)そして前もって感謝します。