Здравствуйте.
У меня вот какая проблема
Необходимо отображать точку в реальном режиме сразу же после ее поступления в программу. Для чистоты эксперимента состряпал простенький тест с 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. Проект целиком указан в виде архива во вложении