Silverlight多线程技术Timer的应用,模拟心电图、模拟CPU、内存状态图

在实际应用中,我们可能会遇到需要实时的显示某一些数据的情况,比如心电图、CPU当前使用率或者内存使用率等等。在Silverlight有一个Timer组件可以轻松的做到这一点,该组件可以每隔一段时间就调用一次需要处理的函数,在此这个函数中通过WebService,WCF等获取到相应的值,然后更新UI上的图表控件,以达到实时更新数据的作用。         现在我们来看看Timer组件的使用思路:

       首先将现有的UI线程赋值出来,并且初始化Timer组件Timer  timer=Timer(TimerCallback, Object, Int32, Int32) 这里有4个参数。

             ●第一个参数是需要处理的函数的委托

             ●第二个参数是需要带入处理函数的参数对象

             ●第三个参数是从创建Timer对象到Timer对象执行委托函数的时间间隔

             ●第四个参数是每隔多少毫秒执行一次委托函数

       然后再委托函数中我们获取到当前的需要显示的数据值,调用UI线程显示到图表中(在本实例中我们使用Random.Next(100)的随机数来模拟数据源)。在数据显示过程中我们可以通过调用timer.Change(int32,int32)来重置Timer启动时间和处理委托函数的间隔时间,也可以通过调用timer.Disponse()方法来释放Timer组件对象。         本实例中为了让节面显得更加的美观大方,我们初始化了30个值50的点,然后在每调用Timer委托的函数中每在最后添加一个点,就将最前面的点减去。下面我们看项目的实例源码(注:本实例基于Visifire图表开发,且源码基于Silverlight实用窍门序列:14.Visifire图表控件的使用一(图表的创建和基础使用)的基础上制作,如有疑问请看第十四节)

双击代码全选
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
< p >///< summary >
/// 创建一个图表
/// summary >
///< param name = "tableName" >表名字 param >
///< param name = "updateTime" >时间段的集合 param >
///< param name = "value" >对应时间段集合的值 param >
///< param name = "row" >本表在主Grid里面的ROW值 param >
///< param name = "column" >本表在主Grid里面的column值 param >
///< param name = "rihgtStr" >Y轴的后缀 param >
///< param name = "tspan" >时间段间隔 param >
///< param name = "chartInterval" >图表两点之间的间隔 param >
///< param name = "intervaltype" >图表的X轴坐标按什么来分类,如时分秒 param >
publicvoid CreateChart(string tableName, int row, int column, string rihgtStr, TimeSpan tspan, int chartInterval, IntervalTypes intervaltype)
         {
// 创建一个图标
             Chart chart =new Chart();
 
// 设置图标的宽度和高度
             chart.Width =500;
             chart.Height =400;
             chart.ToolBarEnabled =true;
 
// 设置图标的属性
             chart.ScrollingEnabled =false;
             chart.View3D =true;
 
// 创建一个标题的对象
             Title title =new Title();
 
// 设置标题的名称
             title.Text = tableName;
             title.Padding =new Thickness(0, 10, 5, 0);
 
// 向图标添加标题
             chart.Titles.Add(title);
 
// 初始化一个新的Axis
             Axis xAxis =new Axis();
 
// 设置axis的属性
//图表的X轴坐标按什么来分类,如时分秒
             xAxis.IntervalType = intervaltype;
//图表中的X轴坐标间隔如2,3,20等,单位为xAxis.IntervalType设置的时分秒。
             xAxis.Interval = chartInterval;
//设置X轴的时间显示格式为7-10 11:20
             xAxis.ValueFormatString ="hh:mm:ss";
//给图标添加Axis
             chart.AxesX.Add(xAxis);
             Axis yAxis =new Axis();
//设置图标中Y轴的最小值永远为0
             yAxis.AxisMinimum =0;
//设置图表中Y轴的后缀
             yAxis.Suffix = rihgtStr;
             chart.AxesY.Add(yAxis);
// 创建一个新的数据线。
                 DataSeries dataSeries =new DataSeries();
 
// 设置数据线的格式。
                 dataSeries.RenderAs = RenderAs.Line;
                 dataSeries.XValueType = ChartValueTypes.DateTime;
 
 
// 添加数据线到数据序列。
                 chart.Series.Add(dataSeries);
 
//将生产的图表增加到Grid,然后通过Grid添加到上层Grid.
             Grid gr =new Grid();
             gr.Children.Add(chart);
             Grid.SetRow(gr, row);
             Grid.SetColumn(gr, column);
             gr.Margin =new Thickness(5);
             gr.VerticalAlignment = VerticalAlignment.Top;
             gr.HorizontalAlignment = HorizontalAlignment.Left;
//增加一个遮罩层到gr,将visifire的水印遮掉。
             StackPanel sp =new StackPanel();
             sp.Width =160;
             sp.Height =18;
             sp.Margin =new Thickness(0, 3, 6, 0);
             sp.VerticalAlignment = VerticalAlignment.Top;
             sp.HorizontalAlignment = HorizontalAlignment.Right;
             sp.Background =new SolidColorBrush(Colors.White);
             gr.Children.Add(sp);
             LayoutRoot.Children.Add(gr);
//初始化30个DataPoint点,这些点都是50的值,一个平滑的曲线,目的在于让后续点的出现不会太唐突导致不美观。
int s =30;
for (int n =0; n < 30 ; n++)
             {
                 DataPoint dpoint = new DataPoint();
                 dpoint.XValue = new DateTime(2010, 2, 15, 6, s+n, 03);
                 Random rom = new Random();
                 dpoint.YValue = 50 .0;
                 chart.Series[0].DataPoints.Add(dpoint);
             }
//将当前的UI进程赋给thread;以供下面使用
             thread = System .Threading.SynchronizationContext.Current;
//启动Timer组件,开始增加DataPoint点
             time = new Timer(AddPoint, chart, 1000, 1000);
         }
//时间标志,不用关注
int TimeFlag = 0 ;
         Timer time;
         System.Threading.SynchronizationContext  thread;
publicvoid AddPoint(object state)
         {
//UI线程更新内容
             thread.Post(delegate
             {
                 Chart chart = state as Chart;
                 DataPoint dpoint = new DataPoint();
                 dpoint.XValue = new DateTime(2010, 2, 15, 7, TimeFlag, 03);
//获取到随机数
                 Random rom = new Random();
int num = rom .Next(100);
                 dpoint.YValue = double .Parse(num.ToString());
                 chart.Series[0].DataPoints.Add(dpoint);
//设置每增加了一个点,就将最前面的那个点去掉。
                 chart.Series[0].DataPoints.Remove(chart.Series[0].DataPoints[0]);
                 TimeFlag++;
             }, null);
 
//此处我们设置标志等于59的时候取消Timer的运行
if (TimeFlag ==59)
             {
                 time.Dispose();
             }
         }

       本实例只模拟了59个点,如有需要稍微修改一下逻辑即可。VS2010+Silverlight 4.0的开发环境,如需源码请点击  SLTimerForCPU.zip 下载。下面请看效果图如下:

【第三秒的图片】

    【第九秒的图片】

【第十九秒的图片】

【第二十五秒的图片】

 

 

你可能感兴趣的:(Silverlight多线程技术Timer的应用,模拟心电图、模拟CPU、内存状态图)