CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов > Форум программистов > Форум .NET > Форум C# .NET



Ответ Создать новую тему
 
Старый 19.06.2009, 00:07   #1
v567
Новичок
 
Регистрация: 18.06.2009
Сообщений: 3
Рейтинг сообщений: 0
Репутация: 0
Злость Проблемы с быстродействием ZedGraph

Здравствуйте.
У меня вот какая проблема
Необходимо отображать точку в реальном режиме сразу же после ее поступления в программу. Для чистоты эксперимента состряпал простенький тест с ZedGraph:
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ZedGraph;
 
namespace Test
{
    public partial class TestForm : Form
    {
        public GraphPane myP;
        long m1, m2;
        LineItem mySerP;
 
 
        public TestForm()
        {
            InitializeComponent();
        }
 
 
        // Изменение ZedGraph с учетом изменения размеров формы
        private void SetSize()
        {
            zg6.Location = new Point(0, 0);
            zg6.Size = new Size(this.ClientRectangle.Width, this.ClientRectangle.Height);
            zg6.Refresh();
        }
 
 
        // Изменение размеров ФМ06
        private void F06_Resize(object sender, EventArgs e)
        {
            SetSize();         // Изменение размеров ZedGrpah
        }
 
 
        private void Form1_Shown(object sender, EventArgs e)
        {
            SetSize();                                                 // Изменение размеров ZedGrpah
            this.Move += new System.EventHandler(this.F06_Resize);
            this.Resize += new System.EventHandler(this.F06_Resize);
        }
 
 
        private void Form1_Load(object sender, EventArgs e)
        {
            SetSize();
 
            myP = zg6.GraphPane;
 
            // Убираем всякий мусор (титлы и надписи по осям)
            myP.Title.FontSpec.Size = 6;
            myP.Title.Text = " ";           // резервируем поле сверху графика
            myP.XAxis.Title.Text = "";
            myP.YAxis.Title.Text = "";
 
            // Настройка шрифта осей
            myP.XAxis.Scale.FontSpec.Size = 9;
            myP.YAxis.Scale.FontSpec.Size = 9;
            myP.XAxis.Scale.FontSpec.IsBold = true;
            myP.YAxis.Scale.FontSpec.IsBold = true;
 
            // Градиентная заливка графика
            myP.Chart.Fill = new Fill(Color.White, Color.Gray, 45F);
            // Градиентная заливка коймы графика
            myP.Fill = new Fill(Color.White, Color.Gray, 45F);
 
            myP.XAxis.Scale.Min = 0;
            myP.XAxis.Scale.Max = 500;
            myP.YAxis.Scale.Min = 0;
            myP.YAxis.Scale.Max = 500;
            myP.AxisChange();               // перерисовка ZedGraph
 
            if (mySerP != null) mySerP.Clear();
 
            double[] XX = new double[1]; double[] YY = new double[1];
            XX[0] = 0; YY[0] = 0;
            mySerP = myP.AddCurve("", XX, YY, Color.DarkBlue);
 
            // Определяем серии измерений
            mySerP.Symbol.Type = SymbolType.Circle;
            // делаем линии соединяющие точки невидимыми
            mySerP.Line.IsVisible = false;
            // толщина линии 2 пикселя
            mySerP.Line.Width = 10;
            // точки в виде сплошных кругов
            mySerP.Symbol.Fill.Type = FillType.Solid;
            // определяем размер точек
            mySerP.Symbol.Size = 4;
        }
 
 
        private void Tm()
        {
            double r;
 
            m2 = DateTime.Now.Ticks;
            r = 0.0000001 * (m2 - m1);
            label1.Text = "Время выполнения= " + r.ToString("0.0") + "сек";
            zg6.Refresh();
            label1.Refresh();
        }
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            double x, y, Sg;
 
            m1 = DateTime.Now.Ticks;
            Sg = 0.0; x = 0.0; 
            while (Sg < (12.0 * Math.PI))
            {
                y = 250.0  + (250.0 * Math.Sin(Sg));
                mySerP.AddPoint((int)(x), (int)(y));
                Sg += (0.5 * 6.0 * Math.PI) / 250.0;
                x += 0.5;
 
                Tm();
            }
        }
    }
}
 
 
Если производить отрисовку поточечно (как в указанном тесте), то тест выполняется слишком долго. Можно ускорить его работу, например как в примере ниже (заменив Refresh() на Invalidate()),
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 
        private void Tm()
        {
            double r;
 
            m2 = DateTime.Now.Ticks;
            r = 0.0000001 * (m2 - m1);
            label1.Text = "Время выполнения= " + r.ToString("0.0") + "сек";
            //zg6.Refresh();
            zg6.Invalidate();
            label1.Refresh();
        }
 
либо как в следующем примере ниже (перенеся Refresh() из Tm() в button1_Click()):
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
        private void button1_Click(object sender, EventArgs e)
        {
            double x, y, Sg;
 
            m1 = DateTime.Now.Ticks;
            Sg = 0.0; x = 0.0; 
            while (Sg < (12.0 * Math.PI))
            {
                y = 250.0  + (250.0 * Math.Sin(Sg));
                mySerP.AddPoint((int)(x), (int)(y));
                Sg += (0.5 * 6.0 * Math.PI) / 250.0;
                x += 0.5;
 
                Tm();
            }
            zg6.Refresh();
            // либо zg6.Invalidate();
        }
 
Однако в этих случаях отрисовка точек производится сразу всех скопом, а их необходимо отображать одну за другой

Подскажите как можно решить данную проблему и существенно ускорить работу данного теста.

P.S. Проект целиком указан в виде архива во вложении
Вложения
Тип файла: zip Test.zip (155.4 Кб, 67 просмотров)
v567 вне форума  
Похожие темы
C# .NET Давайте разбираться - TCPClient
Добрый день ! Предлагаю начать разбираться на тему установления соединения по TCP через TCPClient. Задача - Установить соединение с POP3 почтовым сервером через прокси. Поехали. Начну со.... Давайте разбираться - TCPClient
Заполнить массив случайными числами C# .NET
Помогите пожалуста такое задание: Создань масив 6строк ,3 столбца,заполнисть случайным числами,и пощитать суму всех отрицательных чисел 2-ой строки,и произведение всех ненулевых чисел 1-го столбца. Заполнить массив случайными числами
C# .NET Упорядочить массив объектов по алфавиту
Вообщем делаю курсовую работу в которой содержаться данные о человеке(фамилия,инициалы,день рождения,месяц рождения,знак зодиака). Я создал массив объектов, в качестве объекта используется класс с.... Упорядочить массив объектов по алфавиту
Проверка строки в if-else C# .NET
Я только начал изучать C#, до этого почти не имел дела вообще ни с какими языками. У меня очень простой вопрос,я же сам целый день сижу и не могу понять как мне это сделать. Как правильно.... Проверка строки в if-else
Где скачать Turbo C# Explorer? C# .NET
Не подскажете где можно скачать Turbo C# Explorer, на сайте Borland он раньше вроде был а сейчас его не видно?. Где скачать Turbo C# Explorer?
C# .NET Определение цвета пикселя
Необходимо определить цвет пикселя в формате RGB. Возможно ли это сделать стандартными средствами или необходимы дополнительные библиотеки? Заранее спасибо!. Определение цвета пикселя
Ответ Создать новую тему
Опции темы


Текущее время: 13:06. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Техподдержка — DevArt.Pro
Рейтинг@Mail.ru