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
nie mam pojęcia ile i jakich tych danych musiało by być aby rysowanie wykresu trwało na tyle długo aby zawiesić aplikację na dłuższą chwilę. Opisz chociaż jak to robisz
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;
}
Po co w czyść w każdym przebiegu pętli wywołujesz Update(); Zrób to dopiero po pętli, JEDEN RAZ.
To już poprawiłem jakiś czas temu, teraz sądzę że jako tak działa, muszę posprawdzać czy nigdzie się nie krzaczy.