Silverlight实用窍门系列:25.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图表控件的使用一(图表的创建和基础使用)【附带源码实例】的基础上制作,如有疑问请看第十四节)

复制代码

  
  
/// <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>
public void 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;
public void 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 下载。下面请看效果图如下:

                      【第三秒的图片】                                                                           【第九秒的图片】

                                 【第十九秒的图片】                                                        【第二十五秒的图片】



    本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/03/14/1983987.html,如需转载请自行联系原作者

相关文章
|
1月前
|
数据可视化 Linux iOS开发
Python测量CPU和内存使用率
这些示例帮助您了解如何在Python中测量CPU和内存使用率。根据需要,可以进一步完善这些示例,例如可视化结果或限制程序在特定范围内的资源占用。
82 22
|
5月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
793 166
|
3月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
4月前
|
人工智能 运维 监控
2025年阿里云服务器配置选择全攻略:CPU、内存、带宽与系统盘详解
在2025年,阿里云服务器以高性能、灵活扩展和稳定服务助力数字化转型,提供轻量应用服务器、通用型g8i实例等多样化配置,满足个人博客至企业级业务需求。针对不同场景(如计算密集型、内存密集型),推荐相应实例类型与带宽规划,强调成本优化策略,包括包年包月节省成本、ESSD云盘选择及地域部署建议。文中还提及安全设置、监控备份的重要性,并指出未来可关注第九代实例g9i支持的新技术。整体而言,阿里云致力于帮助用户实现性能与成本的最优平衡。 以上简介共计238个字符。
|
7月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
6月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
605 7
|
6月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
7月前
|
Java
.如何根据 CPU 核心数设计线程池线程数量
IO 密集型:核心数*2 计算密集型: 核心数+1 为什么加 1?即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保 CPU 的时钟周期不会被浪费。
286 4
|
7月前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
977 2
|
7月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
2862 2

热门文章

最新文章

下一篇
oss创建bucket