zoukankan      html  css  js  c++  java
  • 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 下载。下面请看效果图如下:

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

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

  • 相关阅读:
    CSS3 选择器——伪类选择器详细讲解
    关于endnote与word或wps关联的问题
    高通量测序中,reads、contigs、scaffold之间的联系
    转录组中 实验设计 的相关问题
    RNA-Seq分析软件HTSeq的安装
    bash下特殊字符的含义
    常见的测序名词解释
    RNA-seq数据分析注意事项
    RNASeq中常见的分析流程
    WGS/WES/RNAseq/CHIP-seq之间的差别
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/1983987.html
Copyright © 2011-2022 走看看