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

相关文章
|
1月前
|
消息中间件 Java 应用服务中间件
我是如何通过火焰图分析让应用CPU占用下降近20%的
分享作者在使用Arthas火焰图工具进行Java应用性能分析和优化的经验。
|
1月前
|
缓存 运维 监控
CPU被打满/CPU 100%:高效应对策略与技术干货分享
【10月更文挑战第3天】在信息技术高速发展的今天,无论是开发人员、运维人员还是数据分析师,都可能遇到CPU被打满(即CPU使用率达到100%)的情况。这不仅会影响系统的响应速度,严重时甚至会导致服务中断。本文将从诊断、分析与解决三个方面,详细介绍处理CPU 100%问题的技术干货。
96 3
|
1月前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
38 0
|
13天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
14天前
|
弹性计算 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:
|
23天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
198 2
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
41 2
|
1月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
51 2
|
1月前
|
安全 编译器 异构计算
在CPU设计中,为了提高能效比并减少能源消耗,采用了多种节能技术
【10月更文挑战第2天】在CPU设计中,为了提高能效比并减少能源消耗,采用了多种节能技术
54 4

相关实验场景

更多
下一篇
无影云桌面