Avatar
drbohlav.lukas:

Zdravím,

vytvářím grafický monitor pro zobrazení dat, která chodí každých 10ms po sériové lince z řídícího systému do PC. V počítači se tato data okamžitě po dekódování vykreslují. Hodnot je cca 40.

Můj problém je v tom, že slabší PC (občas i moje i7) mají problém s výkonem tak náročného programu. Nemohl by mi někdo poradit, nebo doporučit nějaké možnosti ke zlepšení chodu vykreslování real-time grafu pro více hodnot najednou?

Díky za každou reakci...

 
Odpovědět 19.11.2013 15:23
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na drbohlav.lukas
Jan Vargovský:

Optimalizací je více, ukaž nám jakým stylem to vykresluješ.

Editováno 19.11.2013 15:27
 
Nahoru Odpovědět 19.11.2013 15:26
Avatar
Odpovídá na Jan Vargovský
drbohlav.lukas:

Tady je celá třída co to řeší...

using System;
//ROZHRANNÍ A TŘÍDY, KTERÉ DEFINUJÍ GENERICKÉ KOLEKCE.
//GENERICKÉ KOLEKCE: MOŽNOST SPECIFIKOVAT DATOVÝ TYP AŽ VE CHVÍLI VYTVOŘENÍ INSTANCE.
using System.Collections.Generic;
//POSKYTUJE TŘÍDY, KTERÉ SLOUŽÍ K IMPLEMENTACI CHOVÁNÍ KOMPONENT A ŘÍZENÍ.
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization;
using System.Windows.Forms.DataVisualization.Charting;

namespace WindowsFormsApplication1
{
    public partial class MyGraph : MyControl
    {
        /*odkaz na metodu Show_Ulozene_data ze třídy Monitor.cs*/
        public event MyStringDelegate Show_Old_Value;
        /*Dictionary - kolekce, kde často hledáme prvek podle jedné určité vlastnosti*/
        /*Series - řada, která ukládá datové body a atributy*/
        public Dictionary<String,Series> series;
        /*uložení globálního pole jmen*/
        private String[] jmena = Global.Monitor.Jmena;
        /*proměnna, která ukládá datu ma čas*/
        public DateTime Cursor_date;
        private DateTime Date_Time_posledni;
        public MyGraph()
        {
            InitializeComponent();
            this.BackColor = Color.Transparent;
            /*konstruktor kolekce dictionary*/
            series = new Dictionary<String,Series>();
            /*pro každý prvek z globálního pole jmen se vytvoří nová řada*/
            for (int i = 0; i < jmena.Length; i++) {
                series.Add(jmena[i],new Series());
            }
            /*nastavení pro jednotlivé prvky*/
            for (int i = 0; i < jmena.Length; i++)
            {
                /*zobrazení trendu pomocí linky*/
                series[jmena[i]].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
                /*zobrazení času na ose X*/
                series[jmena[i]].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Time;
                /*přiřezení barev pro jednotlivé spojnice trendu*/
                series[jmena[i]].Color = Global.Monitor.Barvy[i];
                if (Array.IndexOf(Global.Monitor.Bool_data, i) != -1) {
                    series[jmena[i]].ChartArea = "bool";
                }
            }
            chart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";
            chart.ChartAreas["bool"].AxisX.LabelStyle.Format = "HH:mm:ss";
            chart.ChartAreas[0].AxisY.ScaleBreakStyle.Enabled = false;
            chart.ChartAreas[0].AxisY.Maximum = 105;
            chart.ChartAreas[0].AxisY.Minimum = -5;
            chart.ChartAreas["bool"].AxisY.ScaleBreakStyle.Enabled = false;
            chart.ChartAreas["bool"].AxisY.Maximum = 1.5;
            chart.ChartAreas["bool"].AxisY.Interval = 1;
            chart.ChartAreas["bool"].AxisY.IntervalOffset = 0.5;
            chart.ChartAreas["bool"].AxisY.Minimum = -0.5;
            chart.ChartAreas[0].CursorX.Interval = 1;
            chart.ChartAreas[0].CursorX.IntervalType = DateTimeIntervalType.Milliseconds;

            /*Update 18.4.2013*/
            chart.ChartAreas[0].BackColor = Color.White;
            chart.ChartAreas["bool"].BackColor = Color.White;
            chart.BackColor = Color.Transparent;

            chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
            chart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
            chart.ChartAreas["bool"].AxisX.MajorGrid.Enabled = false;
            chart.ChartAreas["bool"].AxisY.MajorGrid.Enabled = false;

            /*Updated 24.4.2013*/
            chart.ChartAreas[0].AxisY.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.False;

            /*získání rozbalovacího labelu u kurzoru*/
            this.chart.GetToolTipText += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs>(this.Chart1_GetToolTipText);

            /*Updated 10.4.2013*/
            ChangeLanguage(Language.Actual);
        }

        /*uložení dat do řady*/
        public void show_data(DATA data)
        {
            try
            {
                for (int i = series[jmena[0]].Points.Count; i < data.Count(); i++)
                {
                    DateTime time = (DateTime)data.data[i]["cas"];

                    int val = 0;
                    for (int j = 0; j < jmena.Length; j++)
                    {
                        val = (int)data.data[i][jmena[j]];
                        val = (int)(((val - Global.Monitor.Min[j]) * 100) / (Global.Monitor.Max[j] - Global.Monitor.Min[j]));
                        series[jmena[j]].Points.AddXY(time, val);
                        Date_Time_posledni = time;
                    }
                }
            }
            catch (InvalidCastException e)
            {
                Global.Log.Error("Graf - chyba v show_data: " + e.Message);
            }
            if(Check_Act_Poin.Checked)
                chart.ChartAreas[0].AxisX.ScaleView.Scroll(ScrollType.Last);
        }
        public void delete_data() {
            for (int j = 0; j < jmena.Length; j++)
            {
                series[jmena[j]].Points.Clear();
            }
        }
        private void ScrollBar_scale_ValueChanged(object sender, EventArgs e)
        {
            ChartArea area1=this.chart.ChartAreas[0];
            ChartArea area2 = this.chart.ChartAreas[1];
            area1.AxisX.ScaleView.Size = ScrollBar_scale.Value;
            area2.AxisX.ScaleView.Size = ScrollBar_scale.Value;
            label2.Text = ScrollBar_scale.Value.ToString();
        }
        private void chart_CursorPositionChanged(object sender, CursorEventArgs e)
        {
            if (((System.Windows.Forms.DataVisualization.Charting.Axis)e.Axis).Name == "Y (Value) axis")
            {
                Point point = PointToClient(MousePosition);
                label_positionY.Location = new Point(label_positionY.Location.X, point.Y - 5);
                double cislo=e.NewPosition;
                if (Double.IsNaN(cislo))
                {
                    label_positionY.Visible = false;
                    return;
                }
                label_positionY.Text = cislo.ToString();
                label_positionY.Visible = true;
                this.Check_Act_Poin.Checked = false;
            }
            if(((System.Windows.Forms.DataVisualization.Charting.Axis)e.Axis).Name == "X axis"){
                try {
                    Cursor_date = DateTime.FromOADate(e.NewPosition);
                    int dny = 0;
                    TimeSpan span = Date_Time_posledni - Cursor_date;
                    dny = span.Days;
                    TimeSpan ts = new TimeSpan(dny,0,0,0,0);
                    Cursor_date += ts;
                    if (Show_Old_Value != null && Check_Act_Poin.Checked==false)
                        Show_Old_Value("");
                }
                catch {
                };
                Point point = PointToClient(MousePosition);
                label_positionX.Location = new Point(point.X, label_positionX.Location.Y);
                label_positionX.Text = Cursor_date.ToString("HH:m:ss");
                label_positionX.Visible = true;
                this.Check_Act_Poin.Checked = false;
            }
        }
        private void Chart1_GetToolTipText(object sender, System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs e)
        {
            if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint)
            {
                int i = e.HitTestResult.PointIndex;
                DataPoint dp = e.HitTestResult.Series.Points[i];
                e.Text = string.Format("{0:HH:mm:ss}, {1:F1}", DateTime.FromOADate(dp.XValue), dp.YValues[0]);
                int xx = chart.Cursor.HotSpot.X;
            }
        }
        private void chart_AxisScrollBarClicked(object sender, ScrollBarEventArgs e)
        {
            label_positionY.Visible = false;
        }
        private void chart_AxisViewChanged(object sender, ViewEventArgs e)
        {
            if (e.Axis.Name != "X axis")
                return;
            if (e.ChartArea.Name == "bool")
            {
                    chart.ChartAreas["line"].AxisX.ScaleView.Zoom(e.ChartArea.AxisX.ScaleView.ViewMinimum, e.ChartArea.AxisX.ScaleView.ViewMaximum);
            }
            else
            {
                if(is_visible_sirie("bool"))
                    chart.ChartAreas["bool"].AxisX.ScaleView.Zoom(e.ChartArea.AxisX.ScaleView.ViewMinimum, e.ChartArea.AxisX.ScaleView.ViewMaximum);
            }
        }
        private bool is_visible_sirie(string name_area) {
            for (int i = 0; i < chart.Series.Count; i++)
            {
                if (chart.Series[i].ChartArea == name_area)
                    return true;
            }
            return false;
        }

        public void ChangeViewColor(Color backColor)
        {
            chart.ChartAreas[0].BackColor = backColor;
            chart.ChartAreas["bool"].BackColor = backColor;
        }

        /*Updated 29.3.2013*/
        public void ChangeLanguage(string lang)
        {

            if (lang == "CZ")
            {
                label1.Text = "Měřít.";
                label3.Text = "Akt.Bod";
            }
            else
            {
                label1.Text = "Scale";
                label3.Text = "Act.Pt";
            }
        }

    }
}
 
Nahoru Odpovědět 19.11.2013 15:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.