Problem jest następujący: w jednym wątku mam pętle która symuluje wrzucanie danych z rs'a do rejestru fifo (tutaj jest to po prostu lista.Add), a w drugiem maluję wykresy jednocześnie odpowiednie wyrzucając dane z rejestru (metoda lista.ramveAt(0)). Oto kod symulujący wrzucanie do rejestru
while (true)
for (int k = 0; k < InternalBufferEKG.Count/2; k++)
{
for (int l = 0; l < panels_nr; l++)
{
if (RsBufferEKG1[l].Count < 200)
RsBufferEKG1[l].Add(InternalBufferEKG[k * 2]);
else
RsBufferEKG1[l][RsBufferEKG1[l].Count-1] = InternalBufferEKG[k * 2];
if (RsBufferEKG2[l].Count < 200)
RsBufferEKG2[l].Add(InternalBufferEKG[k * 2]);
else
RsBufferEKG2[l][RsBufferEKG2[l].Count-1] = InternalBufferEKG[k * 2];
if (RsBufferEKG3[l].Count < 200)
RsBufferEKG3[l].Add(InternalBufferEKG[k * 2]);
else
RsBufferEKG3[l][RsBufferEKG3[l].Count-1] = InternalBufferEKG[k * 2];
if ((RsBufferPuls[l].Count < 200) && ((k & 0x00000001) == 0))
RsBufferPuls[l].Add(InternalBufferPuls[k]);
else if ((RsBufferPuls[l].Count >= 200) && ((k & 0x00000001) == 0))
RsBufferPuls[l].RemoveRange(20, 179);
if ((RsBufferCO2[l].Count < 200) && ((k & 0x00000001) == 0))
RsBufferCO2[l].Add(InternalBufferCO2[k >> 2]);
else if ((RsBufferCO2[l].Count >= 200) && ((k & 0x00000001) == 0))
RsBufferCO2[l].RemoveRange(20, 179);
}
System.Threading.Thread.Sleep(10);
}
Jak widać wrzucam w różne rejestru dane. Jezeli rejestr się przepełni to zamieniam najnowszą daną na obecną.
I teraz w innym wątku maluję wykresu (odpowiednie PictureBox.invoke(...)):
while (true)
{
#region Puls&EKG
//sprawdzenie czy w buforze cos jest
if ((RsBufferEKG1[i].Count > 0)&&(RsBufferEKG2[i].Count > 0)&&(RsBufferPuls[i].Count > 0))
{
CurrTimeEKGPuls[i] += TimeStep[i]; //takie tam dla obrazka parametry
if (CurrTimeEKGPuls[i] > CurrPosEKGPuls[i])
//mniej istotny fragment
{
CurrPosEKGPuls[i]++;
if (CurrPosEKGPuls[i] > PictureLength)
{
CurrPosEKGPuls[i] = 0;
CurrTimeEKGPuls[i] = 0;
}
else
{
//tutaj sa malowania
EKGandPULSpictureBOX[i].Invoke(d1, i); //rysowanie EKG1
if (SignalVisible[i,0] > 1)
EKGandPULSpictureBOX[i].Invoke(d2, i); //rysowanie EKG2
if (SignalVisible[i, 0] > 2)
EKGandPULSpictureBOX[i].Invoke(d3, i); //rysowanie EKG3
if (SignalVisible[i, 1] == 1)
EKGandPULSpictureBOX[i].Invoke(dPuls, i); //rysowanie Puls
if (VisibleSmallPanel[i,1])
PulsBox[i].Invoke(dPulsBox, i);
EKGandPULSpictureBOX[i].Invoke(dClear, i);
}
}
//wyrzucanie z rejestru
RsBufferEKG1[i].RemoveAt(0);
if (SignalVisible[i, 0] > 1) RsBufferEKG2[i].RemoveAt(0);
if (SignalVisible[i, 0] > 2) RsBufferEKG3[i].RemoveAt(0);
if (SignalVisible[i, 1] == 1) RsBufferPuls[i].RemoveAt(0);
}
else
System.Threading.Thread.Sleep(1);
#endregion
}
No i to jest w inny wątku który jak widać kręci się w kółko czekając na dane. Tylko że to dziadostwo jakoś nie działa mi jak fifo. Szybko bufor się zapełnia (nawet jak dam duże czasy wrzucania to i tak sie zapełnia i przebieg jest jekby dwa razy szybszy:/). Coś jest na pewno nie tak tylko co :/