У меня есть 3 класса:
Датчик: непрерывно считывает данные с последовательного порта и анализирует их.Когда данные анализируются, добавляет их в blockingCollection
DataProcessing: получает данные из blockingCollecion и обрабатывает их.
DisplayDataForm: отображает обработанные данные
Как я могу убедиться, что DataProcessing работает непрерывно, но не блокируется, и когда поступают новые данные и обрабатывается ихотображается в форме?
class Sensor
{
public BlockingCollection<double[]> _bufferTimeSeriesData;
public void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[_serialPort1.BytesToRead];
lock (buffer)
{
_serialPort1.Read(buffer, 0, buffer.Length);
double[] samplesAtTimeT;
for (int i = 0; i < buffer.Length; i++)
{
samplesAtTimeT = _BinaryStreamConverter.interpretBinaryStream(buffer[i]);
if (samplesAtTimeT != null)
_bufferTimeSeriesData.Add(samplesAtTimeT); //This is the BlockingCollection
}
_bufferTimeSeriesData.CompleteAdding();
}
}
}
class DataProcessing
{
public void ProcessData()
{
Task.Run(() =>
{
while (Globals.Sensor._bufferTimeSeriesData.IsCompleted)
{
double[] samplesAtTimeT = Globals.Sensor._bufferTimeSeriesData.Take();
//Process data
// writes data to file (is it correct to do it here?)
// Send processed data to form to plot in a chart. HOW??
}
}
}
}
class DisplayForm:Form
{
public void DisplayDataInForm(double[] samples)
{
chartCh1.Series["Signal"].Points.Add(samples[1]);
chartCh2.Series["Signal"].Points.Add(samples[2]);
while (chartCh1.Series["Signal"].Points.Count > 1000)
{
chartCh1.Series["Signal"].Points.Remove(chartCh1.Series["Signal"].Points.First());
chartCh2.Series["Signal"].Points.Remove(chartCh2.Series["Signal"].Points.First());
}
}
}