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

Добро пожаловать на Форум программистов и сисадминов.
Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. После регистрации реклама в сообщениях будет скрыта.

C#.NET
Вопросы использования языка программирования C#.NET. Помощь в решении задач.

Ответ Создать новую тему
 
Опции темы Опции просмотра
Старый 18.06.2009, 23:07   #1 (permalink)
v567
Новичок
 
Регистрация: 18.06.2009
Сообщений: 1
Рейтинг сообщений: 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 Кб, 27 просмотров)
 
v567 вне форума   Ответить с цитированием
Ads
Ответ Создать новую тему

  • Контроль действий персонала за ПК
  • Блокировка нежелательных сайтов, программ, файлов
  • Уведомления о нарушениях политики безопасности
  • Выявление внутренних угроз

  • Опции темы
    Опции просмотра

    Похожие темы
    Тема Автор
    C#.NET, смена раскладки клавиатуры
    здравствуйте. подскажите пожалуйста можно ли с помощью С-шарп менять раскладки клавиатуры мне нужно, что бы при запуске программы раскладка з английской на русскую или украинскую менялась. помогите пожалуйста. заранее благодарен. смена раскладки клавиатуры
    ZuluS
    C#.NET, [C#] Одномерный массив Правильно ли?
    Дана последовательность целых чисел а1,а2,...аn. Выяснить, какое число встречается раньше - положительное или отрицательное. using System; class SerchingP { public static void ReadMasiv(int Mas) { Mas=0; Mas=0; Mas=0;. [C#] Одномерный массив Правильно ли?
    Ocha
    C#.NET, Подпрограммы в C#
    Составить программу для нахождения наибольшего общего делителя четырех натуральных чисел.. Подпрограммы в C#
    Ocha
    C#.NET, Зарядка для ума - найти мах путь
    Добрый всем день! Нужна помощь в написании программки на С# Вручную написала, построила график даже, а как это сделать на С, ума не приложу Суть в том, чтобы найти мах путь, исходные данные - матрица связности задач (т.е. какие задачи не будут выполняться, пока не выполнятся те, от которых они зависят) и длительность выполнения задач. вот мой код, пока выводит только исходные данные using System; class Matrix. Зарядка для ума - найти мах путь
    BelieveInPeople
    C#.NET, XML сериализация в сетевой поток
    Есть непонятная проблема с десериализацией из сетевого потока. На клиентской стороне происходит сериализация класса с данными в сетевой поток. На стороне сервера при подключении клиента открывается поток чтения данных с клиента: private void DoClient() { string clientadr; TcpClient client = tcpListener.AcceptTcpClient(); clientadr = client.Client.RemoteEndPoint.ToString(); Packet d = new Packet(); XmlSerializer.... XML сериализация в сетевой поток
    mr_black
    C#.NET, Есть прога, написанная на с#, БД, туда надо дабавить одну колонку
    Помогите пожалуйста!!!! Есть прога, написанная на с#, БД, туда надо дабавить одну колонку!!! и сделать поиск по этой колонки! НИ разу не работала с c# помогите пожалуйста!!!!. Есть прога, написанная на с#, БД, туда надо дабавить одну колонку
    karapuz13
    C#.NET, C# HTML Parser
    Посоветуйте плз хтмл парсер для C#, желательно с примерами.. C# HTML Parser
    9h05t
    C#.NET, Обрезка html страниц
    Мне необходимо отделять содержимое страницы от оформления (хедер / футер / меню / сайдбары и прочее) для нескольких станиц одного сайта(любого, прога должна работать для любых вариантов). пока есть 2 идеи: 1 Обрезать сразу скрипты и все теги, и дальше анализировать то что осталось, типа отбросить повторяющиеся фрагменты 2 Распарсить HTML, выбрать содержимое всех обьектов, по содержимому посмотреть, является ли оно значащим текстом. Прошу поделиться своими идеями, или посоветовать.... Обрезка html страниц
    9h05t

    Ваши права в разделе
    Вы не можете создавать новые темы
    Вы не можете отвечать в темах
    Вы не можете прикреплять вложения
    Вы не можете редактировать свои сообщения

    BB коды Вкл.
    Смайлы Вкл.
    [IMG] код Выкл.
    HTML код Выкл.



    Часовой пояс GMT +4, время: 02:46.

    Powered by vBulletin® Version 3.8.3
    Copyright ©2000 - 2010, Jelsoft Enterprises Ltd. Перевод: zCarot
    Рейтинг@Mail.ru
    REQUEST_URI /showthread.php?t=41029