Mam rysować wykres na mschart, jednak jakoś nie mam koncepcji jak to robić, dane będą podawane na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) przez inny wątek - pobierający je z serialportu,
jednak operacje na gui 'zawieszają' program dopóki nie skończy się rysować wykres.
Więc powstaje pytanie jak to zogranizować, z góry dzięki za ewentualną pomoc
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 7 lat
- Postów:6
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 7 lat
- Postów:6
na chwilę obecną koleżanka pracuje nad rozkodowaniem danych przesyłanych przez CAN i dołączona do sprzętu bibliotekę dll, wiec dane są generowane randomowo żeby sprawdzić czy jako tak to działa, dane mają być pobierane z drugiego wątku co ileś ms, wartość wybierana przez użytkownika z comboboxa, prócz tego użytkownik wybiera jak długo ma być rysowany wykres -> ile punktów w związku z czym zostanie odczytane.
ogólnie to w moim zamyśle powinno wyglądać tak:
Klik na button -> uruchomienie nowego wątku, z funkcją rysuj_wykres [funkcja jezeli wykresu nie ma narysowanego odwołuje się do czegoś jak config - ustawienie opcji wykresu typu liniowy ilość i nazwa serii itp., potem dodaj [która jest podzielona na dwie czynności - rys - dodaje pkt do wykresu i pobierz_dane
jeżeli znów jest narysowany, robi 'czysc' -> usuwa po kolei serie z wykresu i wykonuje to co wyżej.
ogólnie średnio ogarniam wątki delegaty invoke itp, więc jakieś łopatologiczne wyjaśnienie można prosić ?
tak ściślej względnie rozumiem jak to powinno być -
tworzę wątek wykonujący rysuj_wykres, tam dalej się 'mieli mieli' ale gdy dochodzi do odwołań z mscharta w:
public void rys(int x, int y, int z, Chart chart1)
{
liczba = czas / pauza;
var series1 = chart1.Series["x"];
var series2 = chart1.Series["y"];
var series3 = chart1.Series["z"];
series1.Points.AddXY(i * pauza, x);
series2.Points.AddXY(i * pauza, y);
series3.Points.AddXY(i * pauza, z);
chart1.Update();
}
private void czysc(Chart chart1)
{
while (chart1.Series.Count > 0)
{
chart1.Series.RemoveAt(0);
chart1.Update();
}
i = 0;
}
public void Config(Chart chart1) //konfiguracja wykresu
{
chart1.Series.Add("x");
chart1.Series.Add("y");
chart1.Series.Add("z");
chart1.Series["x"].ChartType = SeriesChartType.Line;
chart1.Series["y"].ChartType = SeriesChartType.Line;
chart1.Series["z"].ChartType = SeriesChartType.Line;
chart1.Series["x"].IsVisibleInLegend = true;
chart1.Series["y"].IsVisibleInLegend = true;
chart1.Series["z"].IsVisibleInLegend = true;
chart1.Series["x"].IsValueShownAsLabel = false;
chart1.Series["y"].IsValueShownAsLabel = false;
chart1.Series["z"].IsValueShownAsLabel = false;
chart1.Series["x"].ToolTip = "x = #VALY{G}";
chart1.Series["y"].ToolTip = "y = #VALY{G}";
chart1.Series["z"].ToolTip = "z = #VALY{G}";
// Setting Line Width
chart1.Series["x"].BorderWidth = 2;
chart1.Series["y"].BorderWidth = 2;
chart1.Series["z"].BorderWidth = 2;
}