Page 1 of 1

Refreshdata - every 5 seconds

Posted: Wed Jun 04, 2008 11:16 am
by 12049157
Using TDBCHart v8.02 I have a dataset connected to 4 TCHarts and collect approx 20,000 datpoints a day (every 5 seconds), which are displayed as 3D Lines.

I add to the dataset as I collect data and call Refreshdata after each datapoint. As you can guess at the begining the graph updates quickly, but as the data grows it takes more and more time to graph the data.

Instead of updating every datatpoint I am using a timer to call RefreshData every 10 seconds and only refresh the graph that is currently showing.

Is there a better way?
Thank you for your time.

Posted: Wed Jun 04, 2008 1:21 pm
by narcis
Hi Stevez,

Yes, I recommend you to have a look at the Real-time Charting article here and the speed examples at the new features demo, available at TeeChart's program group.

Hope this helps!

Posted: Wed Jun 04, 2008 1:40 pm
by 12049157
Thanks Narcis. We are looking to maintain the 3D characteristics and the article you directed me towards deals with TFastLineSeries, TPointSeries.

Is there a fast version of the 3D line?
We collect data daily and the amount of data linearly increases the time it takes toi draw a graph. I thought of using a timer and refreshing the graph every 30 seconds. My problem is that near the end of the day it takes 700msec to draw the graph...

The article recommends streamlining features, which do you recommend for the 3D line.
Thanks again.

Posted: Wed Jun 04, 2008 1:45 pm
by narcis
Hi Stevez,

In that case I recommend you to use series style you wish and try to use as many hints in the article as possible. All of them are for improving performane.

Speeding Up a 3D graph when you know your data

Posted: Mon Jun 09, 2008 3:57 pm
by 12049157
Hi,

A followup on my last question and trying to squeeze out some performance. I need some feedback and validation

What I know:

My data sampled sequentially and time stamped, so there is no need for the controller to order the data :
Series1.XValues.Order := loNone;
Series1.XValues.Order := loNone;

I know min max values some graphs [0%..100%] oters [-100%..100%]
So in Controller at design time I set
Chart.Axis.LeftAxis.Automatic = False & Min=0, Max =100
I have bottom Axis.Auto = True

Measured data is sampled on a 200msec timer and stored to a CSV file.
When someone selectes a device to monitor, if it is not the current device
I load the chart a Memdataset with the stored data and call RefreshData.
If device is active then I add data directly to the memdataset.
(here I could as the article decribes write directly to the Array)

I also did:

Series1.XValues.Order := loNone;
Series1.XValues.Order := loNone;
Canvas.ReferenceCanvas.Pen.OwnerCriticalSection := nil;
Series1.LinePen.OwnerCriticalSection := nil;
Axes.FastCalc := True;


As data is added, I believe that I am waisting time calling RefreshData, is there an alternative that would guarantee that the new data is shown? A day can have up to 50,000 data points. As the day goes by the size of the graph increases significantly...

Looking at Windows Task Manager I think that I could specify that a "Real-time" graph show the most recent 10,000 data points.

Currently I monitor how long it takes to draw the graph and if it is less than 50ticks I graph update graph at every data point (via RefreshData) if it axceeds 50msec I ahow a refresh pushbutton that calls RefreshData.

Thanks in advance for your time and help.

I love your controller!!!

Posted: Tue Jun 10, 2008 8:28 am
by narcis
Hi Stevez,
As data is added, I believe that I am waisting time calling RefreshData, is there an alternative that would guarantee that the new data is shown? A day can have up to 50,000 data points. As the day goes by the size of the graph increases significantly...
What about using Series's CheckDataSource method?