MSChart wątki

0

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

0

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

0

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;

        }
0

Po co w czyść w każdym przebiegu pętli wywołujesz Update(); Zrób to dopiero po pętli, JEDEN RAZ.

0

To już poprawiłem jakiś czas temu, teraz sądzę że jako tak działa, muszę posprawdzać czy nigdzie się nie krzaczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1