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图表开发,且源码基于14.Visifire图表控件的使用一(图表的创建和基础使用)的基础上制作,如有疑问请看第十四节)

 

 
 
  1. /// <summary> 
  2. /// 创建一个图表 
  3. /// </summary> 
  4. /// <param name="tableName">表名字</param> 
  5. /// <param name="updateTime">时间段的集合</param> 
  6. /// <param name="value">对应时间段集合的值</param> 
  7. /// <param name="row">本表在主Grid里面的ROW值</param> 
  8. /// <param name="column">本表在主Grid里面的column值</param> 
  9. /// <param name="rihgtStr">Y轴的后缀</param> 
  10. /// <param name="tspan">时间段间隔</param> 
  11. /// <param name="chartInterval">图表两点之间的间隔</param> 
  12. /// <param name="intervaltype">图表的X轴坐标按什么来分类,如时分秒</param> 
  13. public void CreateChart(string tableName, int row, int column, string rihgtStr, TimeSpan tspan, int chartInterval, IntervalTypes intervaltype) 
  14. // 创建一个图标 
  15. Chart chart = new Chart(); 
  16.  
  17. // 设置图标的宽度和高度 
  18. chart.Width = 500; 
  19. chart.Height = 400; 
  20. chart.ToolBarEnabled = true
  21.  
  22. // 设置图标的属性 
  23. chart.ScrollingEnabled = false
  24. chart.View3D = true
  25.  
  26. // 创建一个标题的对象 
  27. Title title = new Title(); 
  28.  
  29. // 设置标题的名称 
  30. title.Text = tableName; 
  31. title.Padding = new Thickness(0, 10, 5, 0); 
  32.  
  33. // 向图标添加标题 
  34. chart.Titles.Add(title); 
  35.  
  36. // 初始化一个新的Axis 
  37. Axis xAxis = new Axis(); 
  38.  
  39. // 设置axis的属性 
  40. //图表的X轴坐标按什么来分类,如时分秒 
  41. xAxis.IntervalType = intervaltype; 
  42. //图表中的X轴坐标间隔如2,3,20等,单位为xAxis.IntervalType设置的时分秒。 
  43. xAxis.Interval = chartInterval; 
  44. //设置X轴的时间显示格式为7-10 11:20 
  45. xAxis.ValueFormatString = "hh:mm:ss"
  46. //给图标添加Axis 
  47. chart.AxesX.Add(xAxis); 
  48. Axis yAxis = new Axis(); 
  49. //设置图标中Y轴的最小值永远为0 
  50. yAxis.AxisMinimum = 0; 
  51. //设置图表中Y轴的后缀 
  52. yAxis.Suffix = rihgtStr; 
  53. chart.AxesY.Add(yAxis); 
  54. // 创建一个新的数据线。 
  55. DataSeries dataSeries = new DataSeries(); 
  56.  
  57. // 设置数据线的格式。 
  58. dataSeries.RenderAs = RenderAs.Line; 
  59. dataSeries.XValueType = ChartValueTypes.DateTime; 
  60.  
  61. // 添加数据线到数据序列。 
  62. chart.Series.Add(dataSeries); 
  63.  
  64. //将生产的图表增加到Grid,然后通过Grid添加到上层Grid. 
  65. Grid gr = new Grid(); 
  66. gr.Children.Add(chart); 
  67. Grid.SetRow(gr, row); 
  68. Grid.SetColumn(gr, column); 
  69. gr.Margin = new Thickness(5); 
  70. gr.VerticalAlignment = VerticalAlignment.Top
  71. gr.HorizontalAlignment = HorizontalAlignment.Left
  72. //增加一个遮罩层到gr,将visifire的水印遮掉。 
  73. StackPanel sp = new StackPanel(); 
  74. sp.Width = 160; 
  75. sp.Height = 18; 
  76. sp.Margin = new Thickness(0, 3, 6, 0); 
  77. sp.VerticalAlignment = VerticalAlignment.Top
  78. sp.HorizontalAlignment = HorizontalAlignment.Right
  79. sp.Background = new SolidColorBrush(Colors.White); 
  80. gr.Children.Add(sp); 
  81. LayoutRoot.Children.Add(gr); 
  82. //初始化30个DataPoint点,这些点都是50的值,一个平滑的曲线,目的在于让后续点的出现不会太唐突导致不美观。 
  83. int s = 30; 
  84. for (int n = 0; n < 30; n++) 
  85. DataPoint dpoint = new DataPoint(); 
  86. dpoint.XValue = new DateTime(2010, 2, 15, 6, s+n, 03); 
  87. Random rom = new Random(); 
  88. dpoint.YValue = 50.0; 
  89. chart.Series[0].DataPoints.Add(dpoint); 
  90. //将当前的UI进程赋给thread;以供下面使用 
  91. thread = System.Threading.SynchronizationContext.Current
  92. //启动Timer组件,开始增加DataPoint点 
  93. time = new Timer(AddPoint, chart, 1000, 1000); 
  94. //时间标志,不用关注 
  95. int TimeFlag = 0; 
  96. Timer time
  97. System.Threading.SynchronizationContext thread; 
  98. public void AddPoint(object state) 
  99. //UI线程更新内容 
  100. thread.Post(delegate 
  101. Chart chart = state as Chart; 
  102. DataPoint dpoint = new DataPoint(); 
  103. dpoint.XValue = new DateTime(2010, 2, 15, 7, TimeFlag, 03); 
  104. //获取到随机数 
  105. Random rom = new Random(); 
  106. int num= rom.Next(100); 
  107. dpoint.YValue = double.Parse(num.ToString()); 
  108. chart.Series[0].DataPoints.Add(dpoint); 
  109. //设置每增加了一个点,就将最前面的那个点去掉。 
  110. chart.Series[0].DataPoints.Remove(chart.Series[0].DataPoints[0]); 
  111. TimeFlag++; 
  112. }, null); 
  113.  
  114. //此处我们设置标志等于59的时候取消Timer的运行 
  115. if (TimeFlag == 59) 
  116. time.Dispose(); 

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

                            【第三秒的图片】

【第九秒的图片】

 【第十九秒的图片】

【第二十五秒的图片】



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/821979

相关文章
|
19天前
|
编译器 C语言 C++
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
16 0
|
1天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
10 2
|
6天前
|
安全 Java Python
GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。
【6月更文挑战第20天】GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。线程池通过预创建线程池来管理资源,减少线程创建销毁开销,提高效率。示例展示了如何使用Python实现一个简单的线程池,用于执行多个耗时任务。
18 6
|
6天前
|
Java
【技术瑜伽师】Java 线程:修炼生命周期的平衡之道,达到多线程编程的最高境界!
【6月更文挑战第19天】Java多线程编程犹如瑜伽修行,从创建线程开始,如`new Thread(Runnable)`,到启动线程的活跃,用`start()`赋予生命。面对竞争与冲突,借助同步机制保证资源访问的有序,如`synchronized`关键字。线程可能阻塞等待,如同瑜伽的静止与耐心。完成任务后线程终止,整个过程需密切关注状态变换,以求多线程间的和谐与平衡。持续修炼,如同瑜伽般持之以恒,实现高效稳定的多线程程序。
|
6天前
|
Java 开发者
【技术成长日记】Java 线程的自我修养:从新手到大师的生命周期修炼手册!
【6月更文挑战第19天】Java线程之旅,从新手到大师的进阶之路:始于创建线程的懵懂,理解就绪与运行状态的成长,克服同步难题的进阶,至洞悉生命周期的精通。通过实例,展示线程的创建、运行与同步,展现技能的不断提升与升华。
|
6天前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
|
15天前
|
运维 Serverless Nacos
Serverless 应用引擎产品使用合集之在访问量过大的情况下,函数配置的cpu和内存会自动扩容吗
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1天前
|
缓存 自然语言处理 Java
Python的内存管理应用
Python的内存管理应用
|
6天前
|
存储 安全 程序员
c++理论篇——初窥多线程(一) 计算机内存视角下的多线程编程
c++理论篇——初窥多线程(一) 计算机内存视角下的多线程编程
|
19天前
|
编解码 缓存 Android开发
构建高效的Android应用:从内存优化到响应式设计
【5月更文挑战第37天】 在竞争激烈的移动应用市场中,一个高效、流畅的Android应用是吸引和保留用户的关键。本文将深入探讨构建高效Android应用的多个关键方面,包括内存优化策略、布局性能和响应式设计原则。我们将通过具体的技术实践和案例分析,揭示如何提升应用性能,减少资源消耗,并确保在不同设备上的兼容性和用户体验一致性。

热门文章

最新文章

相关实验场景

更多