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,如需转载请自行联系原作者

相关文章
|
7月前
|
存储 机器学习/深度学习 PyTorch
119_LLM训练的高效内存管理与优化技术:从ZeRO到Flash Attention
大型语言模型(LLM)的训练面临着前所未有的计算和内存挑战。随着模型规模达到数百亿甚至数千亿参数,高效的内存管理成为训练成功的关键因素之一。2025年,LLM训练的内存优化技术已经取得了显著进展,从ZeRO优化器到Flash Attention等创新技术,为训练超大规模模型提供了可能。
780 159
|
存储 分布式计算 监控
阿里云服务器实例经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i详解与选择策略
在阿里云现在的活动中,可选的云服务器实例规格主要有经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例,虽然阿里云在活动中提供了多种不同规格的云服务器实例,以满足不同用户和应用场景的需求。但是有的用户并不清楚他们的性能如何,应该如何选择。本文将详细介绍阿里云服务器中的经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例的性能、适用场景及选择参考,帮助用户根据自身需求做出更加精准的选择。
|
9月前
|
存储 机器学习/深度学习 缓存
阿里云九代云服务器怎么样?计算型c9i、通用型g9i、内存型r9i实例介绍
阿里云第9代云服务器主要实例规格包括计算型c9i、通用型g9i、内存型r9i,本文将为大家介绍阿里云九代云服务器中的计算型c9i、通用型g9i、内存型r9i实例的主要性能特点,并分享最新的活动价格信息,以供参考。
826 1
|
9月前
|
机器学习/深度学习 监控 安全
解密虚拟化弹性内存:五大核心技术与实施策略
本文深入解析虚拟化环境中实现内存弹性管理的五大核心技术与实施策略。内容涵盖内存架构演进、关键技术原理、性能优化方法及典型问题解决方案,助力提升虚拟机密度与资源利用率。
398 0
|
11月前
|
存储 缓存 分布式计算
高内存场景必读!阿里云r7/r9i/r8y/r8i实例架构、性能、价格多维度对比
阿里云针对高性能需求场景,一般会在活动中推出内存型r7、内存型r9i、内存型r8y和内存型r8i这几款内存型实例规格的云服务器。相比于活动内的经济型e和通用算力型u1等实例规格,这些内存型实例在性能上更为强劲,尤其适合对内存和计算能力有较高要求的应用场景。这些实例规格的云服务器在处理器与内存的配比上大多为1:8,但它们在处理器架构、存储性能、网络能力以及安全特性等方面各有千秋,因此适用场景也各不相同。本文将为大家详细介绍内存型r7、r9i、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
12月前
|
存储 分布式计算 安全
阿里云服务器内存型实例怎么选?r7/r8y/r8i实例性能、适用场景与选择参考
在选择阿里云服务器时,针对内存密集型应用和数据库应用,内存型实例因其高内存配比和优化的性能表现,成为了众多用户的热门选择。在目前阿里云的活动中,内存型实例主要有内存型r7、内存型r8y和内存型r8i实例可选。为了帮助大家更好地了解这三款实例的区别,本文将详细对比它们的实例规格、CPU、内存、计算、存储、网络等方面的性能,并附上活动价格对比,以便用户能够全面了解它们之间的不同,以供选择和参考。
|
11月前
|
存储 缓存 数据挖掘
阿里云服务器实例选购指南:经济型、通用算力型、计算型、通用型、内存型性能与适用场景解析
当我们在通过阿里云的活动页面挑选云服务器时,相同配置的云服务器通常会有多种不同的实例供我们选择,并且它们之间的价格差异较为明显。这是因为不同实例规格所采用的处理器存在差异,其底层架构也各不相同,比如常见的X86计算架构和Arm计算架构。正因如此,不同实例的云服务器在性能表现以及适用场景方面都各有特点。为了帮助大家在众多实例中做出更合适的选择,本文将针对阿里云服务器的经济型、通用算力型、计算型、通用型和内存型实例,介绍它们的性能特性以及对应的使用场景,以供大家参考和选择。
|
弹性计算 固态存储 ice
阿里云服务器ECS内存型2核16G、4核32G和8核64G配置实例、费用和性能参数表
本文整理了2025年阿里云服务器租赁价格表,涵盖2核16G、4核32G和8核64G配置收费标准。CPU内存比为1:8,提供多种实例规格如ECS内存型r8i、通用算力型u1等。价格由CPU内存、公网带宽及系统盘组成,支持优惠折扣(年付6.7折起)。文中详细列出各配置参考价格、公网带宽与系统盘收费,并对比不同实例规格性能,如Intel Xeon和AMD EPYC处理器系列,帮助用户选择高性价比方案。具体价格以阿里云官网为准。
1597 4
|
存储 编解码 安全
阿里云高性能企业级甄选Intel第八代计算型c8i、通用型g8i和内存型r8i实例简介
计算型c8i、通用型g8i和内存型r8i实例是阿里云推出的高性能企业级甄选Intel第八代云服务器实例,采用CIPU+飞天技术架构,搭载最新的Intel 第五代至强可扩展处理器(代号EMR),性能进一步大幅提升,同时拥有AMX加持的AI能力增强,并在全球范围率先支持TDX机密虚拟机能力,实现了AI增强和全面安全防护的两大特色优势。本文将为您介绍这三个实例规格的性能、适用场景及最新活动价格以及选择指南,以供选择参考。
574 18
|
存储 弹性计算 安全
阿里云服务器实例选择:经济型、通用算力型、计算型、通用型、内存型实例选择参考
当我们通过阿里云的活动购买云服务器会发现,相同配置的云服务器往往有多个不同的实例可选,而且价格差别也比较大,例如同样是4核8G的配置的云服务器,经济型e实例活动价格1595.11元/1年起,通用算力型u1实例要955.58元/1年起,而计算型c8i实例则要2845.81元/1年起,价格差别还是比较大的,因此,阿里云经济型、通用算力型、计算型、通用型、内存型实例云服务器有何差别就是很多新手用户比较关心的问题了,下面小编来为大家简单介绍下它们之间的区别。
1004 16

热门文章

最新文章