【发布时间】:2015-09-30 18:55:26
【问题描述】:
我有一个读取数据并将其添加到缓冲区的采集设备。这是在一个单独的线程中完成的。一旦这些数据出队,我就会设置一个委托来引发 OnDataRead() 事件。
在我的信号监视器中,当收到事件时,我想在多个图表中绘制数据(总共 16 个)。我成功地绘制了第一个样本,但随后图表停止绘制数据,从 16 号开始并逐渐停止所有这些样本。这样做的正确方法是什么?我需要一个单独的线程吗?
接收带有数据的事件
public void OnDataRead(object source, DataEventArgs e)
{
if (e.rawData.Length > 0)
{
AddData(e.rawData, e.numChannels, e.triggerEnabled);
}
}
在适当的图表中添加数据点
private void AddData(float[] rawData, int numChannels, bool triggerEnabled)
{
//for (int i=0; i<chChannels.Count; i++)
// {
if (this.InvokeRequired)
{
SetAddDataCallback d = new SetAddDataCallback(AddData);
this.Invoke(d, new object[] {rawData, numChannels, triggerEnabled})
;
}
else
{
DateTime timeStamp = DateTime.Now;
// Find the channel selected
int channelIdx = 0; //boxChannelSelection.SelectedIndex;
// Add new data points for the selected channel
for (int sampleIdx = 0; sampleIdx < rawData.Length; sampleIdx++)
{
channelIdx = sampleIdx %(numChannels + 1);
if (triggerEnabled && (channelIdx != numChannels))
{
foreach (Series ptSeries in chChannels[channelIdx].Series)
{
AddNewPoint(timeStamp, rawData[sampleIdx], channelIdx, ptSeries);
}
}
else if (!triggerEnabled)
{
foreach (Series ptSeries in chChannels[channelIdx].Series)
{
AddNewPoint(timeStamp, rawData[sampleIdx], channelIdx, ptSeries);
}
}
}
}
// }
}
在图表中绘制新数据点
public void AddNewPoint(DateTime timeStamp, float yValue, int channel, System.Windows.Forms.DataVisualization.Charting.Series ptSeries)
{
ptSeries.Points.AddXY(timeStamp.ToOADate(), yValue);
// Remove old datapoints if needed
double removeBefore = timeStamp.AddSeconds((double)(8) * (-1)).ToOADate();
while (ptSeries.Points[0].XValue < removeBefore)
{
ptSeries.Points.RemoveAt(0);
}
chChannels[channel].ChartAreas[0].AxisX.Minimum = ptSeries.Points[0].XValue;
chChannels[channel].ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(ptSeries.Points[0].XValue).AddSeconds(10).ToOADate();
chChannels[channel].Invalidate();
【问题讨论】:
-
绘图何时停止:删除第一批点之前还是之后?你为什么写
(double)(8) * (-1)?删除后移动 addxy 会改变什么吗? -
我在删除第一批点之前停下来。 (double)(8) * (-1) 是删除当前点前8秒的点,不断更新情节。
-
我认为一个好的方法是当收到新数据时,将其添加到缓冲区(链表),然后有一个单独的线程,每 100 毫秒使用存储在缓冲区中的数据更新图表。导致它崩溃的原因是每次收到新数据时都会更新 16 个图表。你怎么看?