Real-Time Charting Problem

TeeChart for Microsoft Visual Studio .NET, Xamarin Studio (Android, iOS & Forms) & Monodevelop.
Post Reply
cepri
Newbie
Newbie
Posts: 8
Joined: Fri Jul 01, 2005 4:00 am

Real-Time Charting Problem

Post by cepri » Mon Jul 07, 2008 3:55 am

Dear friends:

Real-time charting with TeeChart .net v3, there is a problem:

There is a fastline "fastline1" in a TeeChart "tchart1", I want to add some data into fastline1 and "tchart1" will repaint at the same time.
I have tried 2 ways:

tchart1.AutoRepaint = true;

1: Use "For(){...}", the codes:
Random rd = new Random();
for (int i = 0; i < 10000; i++)
{
fastLine1.Add(rd.Next(0, 10));
}

Result: tchart1 did not real-time charting as i wish.
I think tchart1 will update 10000 times, because tchart1.AutoRepaint = true, so when a data was added to fastlines1, it will repaint, it means realtime charting. But in fact, it repaint only one time, when the "for " is over.
Why tchart1 did not real time charting? I think may be the time interval between two steps of the "for" is too short, so the tchart1 did not repaint, and i change the codes like this:
for (int i = 0; i < 100000000; i++)
{
if (i%1000000==0)
{
fastLine1.Add(rd.Next(0, 10));
}
}

the time interval is much longer, however, the result is the same as the old: tchart1 did not real-time charting.


2: Use a Timer "timer1" :

timer1.Interval = 1;//1 ms

Random rd = new Random();
private void timer1_Tick(object sender, EventArgs e)
{
fastLine1.Add(rd.Next(0, 10));
}


Result: tchart1 real-time charting.


the questions:

1, I thick adding data in the way of "For(){...}" and Timer are the same in the essentially, they are both add data to fastline one by one. but why the result are so different? How does the "AutoRepaint" property work?

2, The method 2 can real-time charting, but the speed is not very fast. The timer must be added, adn the mini time interval is 1 ms, which is very long for me. In my work, there are two process:A and B, A sends curve data and B receives the data and draw chart dynamicly with TeeChart, the speed is very fast, maybe 10000 times in 1 second, and i want the TeeChart Real-Time Charting as fast as possible. So the question is : Can the TeeChart do this? if "Yes", How can it do?

Please forgive my poor English. ^_^

if you have any idea, please contact me:
e-mail: xiongxuanwen@163.com

Thank you very much!

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Mon Jul 07, 2008 7:30 am

Hi cepri,

For information on how to use AutoRepaint please read the Real-time Charting article here. This is a Delphi and TeeChart VCL article but most of it can also be applied to .NET version. It will also help increase your application's performance. I also recommend you to have a look at the All Features\Welcome !\Speed\Realtime charting examples in the features demo.

Hope this helps!
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

cepri
Newbie
Newbie
Posts: 8
Joined: Fri Jul 01, 2005 4:00 am

Post by cepri » Tue Jul 08, 2008 9:35 am

narcis wrote:Hi cepri,

For information on how to use AutoRepaint please read the Real-time Charting article here. This is a Delphi and TeeChart VCL article but most of it can also be applied to .NET version. It will also help increase your application's performance. I also recommend you to have a look at the All Features\Welcome !\Speed\Realtime charting examples in the features demo.

Hope this helps!
Hi Narcís Calvet ,

Thank you for your help!
I have read the article and demo you mentioned, but the problem still exists.

1. Use for loop to add points in .net:
Random rd = new Random();
for (int i = 0; i < 10000; i++)
{
fastLine1.Add(rd.Next(0, 10));
}
The result: the tchart1 does not real-time charting: the fastLine1 does not show in the process of the loop, it shows in the end of the loop.
But in c++ builder, I use loop to add points, the tchart will do real-time charting, it's very strange.

2. Use timer to add points:
timer1.Interval = 1;//1 ms
Random rd = new Random();
private void timer1_Tick(object sender, EventArgs e)
{
fastLine1.Add(rd.Next(0, 10));
}
The result: the tchart1real-time charting: the fastLine1 shows and changes when one data have been added to fastLine1.

The two methods are both to add data to fastLine1 one by one, but why the result is so different?
If I want to do real-time charting, using loop to add points to series, what should I do?

Thank you again!

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Tue Jul 08, 2008 10:34 am

Hi cepri,

The problem could be that the chart hasn't had the time to be painted one another point is already added. You can try using code below after calling Add method.

Code: Select all

            fastLine1.RefreshSeries();

            Thread.Sleep(1000); 
Hope this helps!
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

cepri
Newbie
Newbie
Posts: 8
Joined: Fri Jul 01, 2005 4:00 am

Post by cepri » Wed Jul 09, 2008 12:56 am

narcis wrote:Hi cepri,

The problem could be that the chart hasn't had the time to be painted one another point is already added. You can try using code below after calling Add method.

Code: Select all

            fastLine1.RefreshSeries();

            Thread.Sleep(1000); 
Hope this helps!
Hi Narcís Calvet,

Thank you!
I have try the method like this:

for (int i = 0; i < 100; i++)
{
fastLine1.Add(rd.Next(0, 10));
fastLine1.RefreshSeries();
Thread.Sleep(1000);
}

but it does not work as I wish, the fastLine1 doesn't show point by point in the process of the loop, it shows as a whole line at the end of the loop.

Do you have any e-mail? I want to send the project to you.

Thanks.

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Wed Jul 09, 2008 7:32 am

Hi cepri,

Yes, please, send us a simple example project we can run "as-is" to reproduce the problem here.

You can either post your files at news://www.steema.net/steema.public.attachments newsgroup or at our upload page.

Thanks in advance.
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

cepri
Newbie
Newbie
Posts: 8
Joined: Fri Jul 01, 2005 4:00 am

Post by cepri » Thu Jul 10, 2008 1:45 am

Hi Narcís Calvet,
I have upload the project files to upload page, the file name is "real-time charting.rar" , please check it.
Hope for your help!
Thanks!

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Thu Jul 10, 2008 8:50 am

Hi cepri,

Using the for loop for populating series works fine for me here, series is being refreshed as points are added to it. I'm using latest TeeChart for .NET v3 build available at the client area, which was posted on 2nd July (build 3.5.3105.20150/1/2). Could you please try if this version works better at your end?

Regarding the timer issue, you could try doing something like this:

Code: Select all

        private void timer1_Tick(object sender, EventArgs e)
        {
						//fastLine1.Add(rd.Next(0, 10));
						for (int i = 0; i < 10; i++)
						{
							fastLine1.Add(rd.Next(0, 10));
							//tChart1.Refresh();//repaint the chart
						}
						fastLine1.RefreshSeries();
        }
This works fine for me too.
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

cepri
Newbie
Newbie
Posts: 8
Joined: Fri Jul 01, 2005 4:00 am

Post by cepri » Tue Jul 15, 2008 7:20 am

Hi,Narcís Calvet


With the new version, it still cann't do real time plotting.

Inorder to check if the chart is plotted all points at the same time or plotted one point after another, I change a few of the code in the file named "FastLine_Realtime.cs" for the demoprojects. Now. the demo of "Fast Delete and Fast pen" chart will plot 10 points. After the button "Start" is pressed, it will delay 10 seconds and then plot all points at once. But what I need is that it will plot one point every 1 second.

The version I used is as below:
Release Notes 3rd July 2008
TeeChart.NET version 3
Build 3.5.3105.20155

The changed code of the file ""FastLine_Realtime.cs"" in demo is:

private void button1_Click(object sender, System.EventArgs e)
{
if (Stopped)
{
// Start loop...
button1.Text="&Stop";
textBox2.Enabled=false;
textBox3.Enabled=false;

MaxPoints=10;
// Prepare variables
// MaxPoints=Convert.ToInt32(textBox2.Text);
ScrollPoints=Convert.ToInt32(textBox3.Text);
tChart1.Axes.Bottom.SetMinMax(1,MaxPoints);
tChart1.Axes.Left.SetMinMax(-30,30);
// Clear
fastLine1.Clear();
fastLine2.Clear();
Random r = new Random();
fastLine1.Add(r.Next(10));
fastLine2.Add(r.Next(10));
Application.DoEvents();

Stopped=false;

// Start loop
while (!Stopped)
{
System.Threading.Thread.Sleep(1000);
// Add one more point
RealTimeAdd(fastLine1);
RealTimeAdd(fastLine2);

fastLine1.RefreshSeries();

if (fastLine1.Count>MaxPoints-1)
break;
}
}
else
{
// Finish
Stopped=true;
button1.Text="&Start";
textBox2.Enabled=true;
textBox3.Enabled=true;
}
}

AIS
Newbie
Newbie
Posts: 70
Joined: Wed Jun 25, 2008 12:00 am

Post by AIS » Tue Jul 15, 2008 9:21 am

Hi cepri,

i think instead of "fastLine1.RefreshSeries();" you must using "tChart1.Refresh();" or "tChart1.AutoRepaint=true;"?

cepri
Newbie
Newbie
Posts: 8
Joined: Fri Jul 01, 2005 4:00 am

Post by cepri » Wed Jul 16, 2008 1:48 am

Hi,Narcís Calvet

If I use "tChart1.Refresh()", The chart can do real time charting. But the plot speed is very slow, especially for a large number of XY points.

if I use "tChart1.AutoRepaint=true", "tChart1.Refresh()" must be used for real-time charting.

The property "tChart1.AutoRepaint" in C#.Net does not working in the way as the user manual says, and is different from that in c++ builder.

In c++ builder, If tChart1.AutoRepaint is false, the chart can do real time charting, although the plotting speed is not very satisfactory for a large number of XY points.

Best Regards
CEPRI

cepri
Newbie
Newbie
Posts: 8
Joined: Fri Jul 01, 2005 4:00 am

Post by cepri » Wed Jul 16, 2008 1:57 am

Hi Narcís Calvet,

Thank you!

If I use "tChart1.Refresh();" , the chart will do real time charting, but the speed is very slow, especially for a large number of XY points.

The property "tChart1.AutoRepaint" in C#.Net does not work in the way as the user manual says, and is different from that in C++ builder.

In C++ builder, if the property "tChart1.AutoRepaint" is false, the function of real time charting is right, although the speed is not very satisfactory for a large number of XY points.

_________________
Best Regards
CEPRI

AIS
Newbie
Newbie
Posts: 70
Joined: Wed Jun 25, 2008 12:00 am

Post by AIS » Wed Jul 16, 2008 6:37 am

Hi cepri,

i use the following changes to do realtime charting:

Code: Select all

tChart1.BackColor = System.Drawing.Color.Transparent;
tChart1.Header.Visible = false;
tChart1.Legend.Visible = false;
tChart1.Panel.Brush.Gradient.Visible = false;
tChart1.Panning.Allow = Steema.TeeChart.ScrollModes.None;
tChart1.Walls.Visible = false;
tChart1.Zoom.Allow = false;
tChart1.Aspect.View3D = false;
tChart1.Aspect.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
tChart1.Aspect.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault;
tChart1.Aspect.ZoomText = false;
tChart1.Aspect.ClipPoints = false;
tChart1.AutoRepaint = true;


tChart1.Axes.Bottom.Labels.RoundFirstLabel = false;
tChart1.Axes.Left.AxisPen.Width = 1;
tChart1.Axes.Bottom.AxisPen.Width = 1;
tChart1.Axes.Left.Grid.Visible = false;
tChart1.Axes.Bottom.Grid.Visible = false;
tChart1.Axes.Left.Automatic = false;
tChart1.Axes.Left.SetMinMax(-1, 1);
tChart1.Axes.Bottom.Increment = 10;

fastLine1.XValues.Order = Steema.TeeChart.Styles.ValueListOrder.None;
fastLine1.AutoRepaint = false;
fastLine1.DrawAllPoints = false;
fastLine1.LinePen.Width = 1;
I use a timer and his tick method. In my testapplication i draw a sinus with a maximum of 80 visible points, a new point cause an delete of index 0 "fastLine1.Delete(0);". So it is possible for me to draw about 27-35 points per sec. If in that time the chart draw realtime i cant see ;)

i hope it can help you.

Bye

Post Reply