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, 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, 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 下载。下面请看效果图如下:

                            【第三秒的图片】

【第九秒的图片】

 【第十九秒的图片】

【第二十五秒的图片】

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的IsEnabled=“{BindingABC}”,但这不起作用–MenuItem总是启用.提前感谢您的线索!干杯编辑:有趣的是,当设置Mode=TwoWay时,绑定似乎有效.但是,在菜单项上移动鼠标后,将更新上下文菜单的外观.这是异步工作吗?右键
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,因为我确信即使是一个c#人也可以使用类似的.net实现来回答这个问题).我申请的简短说明:我的桌面应用程序将仅在win平台上运行,使用vb.net,它是一个简单的网吧管理软件,在服务器上运行服务器gui,在工作站上运行客户端gui,
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如果它在UIThread上,如何将文件请求和ProcessFile()移动到单独的线程?varxClient=newServiceReference1.Service1SoapClient();xClient.Retrieve_File_Completed+=newEventHandler<ServiceReference1.Retrieve_Fi
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不在办公室使用sharepoint.所以不知道如何开始.这些是我的新手问题>学习共享点值得努力吗?>学习sharepoint的资源在哪里?>我是否应该考虑开发哪些参考项目?感谢您的意见.解决方法:SharePoint以如此积极的方式改变了我的职业
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:Thecollectiondatacontracttype‘System.Collections.Generic.Listcannotbedeserializedbecauseitdoesnothaveapublicparameterlessconstructor.Addingapublicparameterlessconstructorwillf
我需要根据Silverlight中的某些配置值设置给定控件的Style.我想有可能从两种可用的样式(静态资源)中选择一个控件样式.我试图做一些像:<TextBoxStyle="{BindingABC}"/>哪里publicstringABC{get{return"{StaticResourceMyStyle}";}}不幸的是,这不起作用.你有
我刚买了第一台Android设备,我喜欢它…我也很喜欢你可以创建自己的应用程序并随意分发它们.我已经阅读了一些关于Monodroid的内容,而且显然微软希望将Silverlight放在这些设备上,尽管没有太多关于它们的信息……但是Moonlight呢?如果Monodroid就像Mono……为什么我们需要它呢?相反
我们的ASP.NET网站允许用户执行各种查询,并根据从数据库查询的结果显示网络图(如UML图).目前,我们正在生成一个位图并显示它.但由于我们需要支持允许用户以交互方式显示/隐藏某些块的功能,因此我们计划使用Silverlight来渲染图形.我们还计划在未来添加更多互动.我有两个问题:>ASP
我正在开发一个Silverlight4应用程序,我已经创建了一个自定义的启动画面.乍一看,自定义启动画面运行良好–非常好.几天后,我开始注意到闪屏不再显示,屏幕仍然是空白.这似乎只发生在我打开多个指向同一个应用程序的IE选项卡/窗口时.前几个将加载正常,而以下选项卡/窗口将保持“白
这是我的XAML:<ImageVerticalAlignment="Center"HorizontalAlignment="Center"Source="{BindingInput,Converter={StaticResourceByteArrayToBitmapConverter}}"><Image.Rend
问候,我有一个ItemsControl,我更改了模板,为绑定的ItemsSource中的每个对象显示一个RadioButton.但是ItemsSource可以为空,当它为空时我想显示默认值.像“绑定列表中没有可供您选择的项目”……我想到的一种方法是将ItemsControl.Visibility设置为Collapsed,并将TextBlock.Vsibi
堆栈溢出的第一个问题……我是C#的新手,但在学习它时却非常直接.几分钟前我才看到这个tutorial.通过各种c#技术阅读WCF,WPF,Silverlight,c#和asp.net,这是很多技术都可以用c#来实现.我将创建一个Web应用程序c#.我认为SilverLight似乎是我最好的选择.该应用程序将拥有一个数
我正在使用MVVM(Model-View-ViewModel)模式编写应用程序,并利用MicrosoftP&P团队的Prism和Unity位.我有一个包含项目列表的视图.这些项包含在ViewModel中的ObservableCollection中,View中的列表框是数据绑定的(ViewModel设置为View的DataContext).在ViewModel中,我有一个运行的
我有一个应用程序,它在首次运行时显示免责声明页面.选择“接受”或“拒绝”后,您再也看不到该页面了.但是,当您在第一次运行后按后退键尝试关闭应用程序时,您将返回免责声明页面,然后再次点击该页面,返回主页面,然后再次退出.这仅在应用程序第一次运行时发生,但我希望应用程序在
我正在尝试在SilverlightforWindowsPhone中使用异步HttpWebRequest.一切都很完美,直到我到达我应该打电话的地方privatestaticManualResetEventallDone=newManualResetEvent(false);...request.BeginGetResponse(newAsyncCallback(GetResponseCallback),request);a
嗨,我有两个Writablebitmap,一个来自jpg,另一个来自png,并使用此方法在循环中混合颜色:privatestaticColorMix(Colorfrom,Colorto,floatpercent){floatamountFrom=1.0f-percent;returnColor.FromArgb((byte)(from.A*amountFrom+to.A*perc
我需要开发一个程序,它包含一个图像(png),中心有一个洞.在这个图像下将有一个框架,我想点击图像的透明孔我可以点击框架内的按钮.我不知道是否有一种方法可以通过图像或其他方式传播点击.谢谢你的帮助解决方法:你在图像上将IsHitTestVisible设置为false,然后点击浏览.
我正在研究一个silverlight应用程序,我发现List没有Find扩展方法说,List<Something>list=newList<Something>(something);list.Remove(list.Find(e=>e.id==10));没有查找扩展方法我错过了什么?解决方法:它不包括在内以减小运行时的大小.建议您使用LINQ扩展,例如First
我试图弄清楚如何设置Path元素的Data属性来获得此类型的软角:alttexthttp://i42.tinypic.com/1rzu6w.jpg现在我只有这样的尖角:alttexthttp://i42.tinypic.com/2eeleah.jpg我尝试用椭圆玩,但我无法得到我想要的东西.谢谢最佳答案:路径的段具有IsSmoothJoin属性,默认为false.
问题我有一个在远程服务器上运行的restfulWeb服务.我已经制作了一个使用它的WP7应用程序,所以我知道它有效.我正在将应用程序移植到SilverlightWeb应用程序并遇到问题.我已经包含了代码的简化版本以及引发的错误.EndGetResponse方法抛出错误.随意询问更多信息.我一直在寻找解