彩票走势图

Visifire Silverlight图表多线程技术Timer应用详解

原创|其它|编辑:郝浩|2012-10-19 15:55:35.000|阅读 576 次

概述:实际应用中,我们可能会遇到需要实时的显示某一些数据的情况,比如心电图、CPU当前使用率或者内存使用率等等,在Silverlight有一个Timer组件可以轻松的做到这一点,本文将做一定的介绍

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

在实际应用中,我们可能会遇到需要实时的显示某一些数据的情况,比如心电图、CPU当前使用率或者内存使用率等等。在Visifire 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委托的函数中每在最后添加一个点,就将最前面的点减去。下面我们看项目的实例源码:

/// <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的开发环境,下面请看效果图如下:

Visifire Silverlight图表多线程技术Timer应用详解

Visifire Silverlight图表多线程技术Timer应用详解

Visifire Silverlight图表多线程技术Timer应用详解

Visifire Silverlight图表多线程技术Timer应用详解


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP