WPF 动态模拟CPU 使用率曲线图

在工作中经常会遇到需要将一组数据绘制成曲线图的情况,最简单的方法是将数据导入Excel,然后使用绘图功能手动生成曲线图。但是如果基础数据频繁更改,则手动创建图形可能会变得枯燥乏味。本篇将利用DynamicDataDisplay  在WPF 中动态模拟CPU 使用率图表,实现动态生成曲线图。

新建项目将DynamicDataDisplay.dll 加载到References 中,打开MainWindow.xaml 添加命名空间xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"。通过<d3:ChartPlotter> 创建一个图表框架,在其中添加两条整型坐标轴,X轴:<d3:HorizontalIntegerAxis>,Y轴:<d3:VerticalIntegerAxis>。<d3:Header> 用来设置图表名称,<d3:VerticalAxisTitle> 用来设置Y轴名称。

<Window x:Class="WpfPerformance.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0" Title="CPU Performance" Loaded="Window_Loaded" Height="350" W
idth="525"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal"> <TextBlock Text="CPU Usage" Margin="20,10,0,0" FontSize="15" FontWeight="Bold"/> <TextBlock x:Name="cpuUsageText" Margin="10,10,0,0" FontSize="15"/> </StackPanel> <d3:ChartPlotter x:Name="plotter" Margin="10,10,20,10" Grid.Row="1"> <d3:ChartPlotter.VerticalAxis> <d3:VerticalIntegerAxis /> </d3:ChartPlotter.VerticalAxis> <d3:ChartPlotter.HorizontalAxis> <d3:HorizontalIntegerAxis /> </d3:ChartPlotter.HorizontalAxis> <d3:Header Content="CPU Performance History"/> <d3:VerticalAxisTitle Content="Percentage"/> </d3:ChartPlotter> </Grid></Window>

  接下来工作需要通过C#每秒获取一次CPU使用率,并将这些数据生成坐标点(Point)绘制在图表中。 以下是MainWindow.xaml.cs 部分的代码内容。

using System;using System.Diagnostics;using System.Windows;using System.Windows.Media;using System.Windows.Threading;using Microsoft.Research.DynamicDataDisplay;using Microsoft.Research.DynamicDataDisplay.DataSources;namespace WpfPerformance{ public partial class MainWindow : Window { private ObservableDataSource<Point> dataSource = new ObservableDataSource<Point>(); private PerformanceCounter cpuPerformance = new PerformanceCounter(); private DispatcherTimer timer = new DispatcherTimer(); private int i = 0; public MainWindow() { InitializeComponent(); } private void AnimatedPlot(object sender, EventArgs e) { cpuPerformance.CategoryName = "Processor"; cpuPerformance.CounterName = "% Processor Time"; cpuPerformance.InstanceName = "_Total"; double x = i; double y = cpuPerformance.NextValue(); Point point = new Point(x, y); dataSource.AppendAsync(base.Dispatcher, point); cpuUsageText.Text = String.Format("{0:0}%", y); i++; } private void Window_Loaded(object sender, RoutedEventArgs e) { plotter.AddLineGraph(dataSource, Colors.Green, 2, "Percentage"); timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += new EventHandler(AnimatedPlot); timer.IsEnabled = true; plotter.Viewport.FitToView(); } }}

通过ObservableDataSource<Point> 动态存储图表坐标点,PerformanceCounter 获取CPU使用率数值,DispatcherTimer 计时器在规定间隔进行取数操作,整型i 作为CPU使用率坐标点的X轴数值。

private ObservableDataSource<Point> dataSource = new ObservableDataSource<Point>();private PerformanceCounter cpuPerformance = new PerformanceCounter();private DispatcherTimer timer = new DispatcherTimer();private int i = 0;

AnimatedPlot 事件用于构造坐标点,通过设置cpuPerformance 相关参数,并使用NextValue() 方法获取当前CPU使用率数据作为Y值,整型i 作为X值。将X、Y值构造为坐标点(Point),并通过异步方式存储在dataSource 中。

private void AnimatedPlot(object sender, EventArgs e){ cpuPerformance.CategoryName = "Processor"; cpuPerformance.CounterName = "% Processor Time"; cpuPerformance.InstanceName = "_Total"; double x = i; double y = cpuPerformance.NextValue(); Point point = new Point(x, y); dataSource.AppendAsync(base.Dispatcher, point); cpuUsageText.Text = String.Format("{0:0}%", y); i++;}

最后通过Window_Loaded 将事件加载到<Window> 中,AddLineGraph 方法将dataSource 中的坐标点绘制到图表中,曲线颜色定义为绿色,粗细设置为2,曲线名称为"Percentage"。设置计时器间隔为1秒,连续执行AnimatedPlot 事件实时绘制新坐标点。

private void Window_Loaded(object sender, RoutedEventArgs e){ plotter.AddLineGraph(dataSource, Colors.Green, 2, "Percentage"); timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += new EventHandler(AnimatedPlot); timer.IsEnabled = true; plotter.Viewport.FitToView();}

鼠标右键可将图表拷贝到其他文档:

动态演示

鼠标左键拖动图表浏览任意位置曲线数据,鼠标中键可以缩放显示曲线图。

源代码下载

WpfPerformance.zip

时间: 2024-12-23 09:20:57

WPF 动态模拟CPU 使用率曲线图的相关文章

C#TCP通信时模拟客户端断开后服务端的CPU使用率从45%上升到80%-90%

问题描述 我使用C#的TCPlistener写了一个TCP服务端的程序,用来向连接到服务端的客户端发送数据的,客户端发送不同的请求就发送相应的数据,没有请求数据就什么也不发送:发送的数据是从另一个端口接收到的UDP的报文解析后的数据服务端程序包括接收及解析UDP报文,和TCPlistener监听(有连接请求就建立一个线程为这个连接服务,连接断开就终止线程)现在当服务端程序启动,就开始接收UDP报文并解析,如果有连接请求,就创建线程并为连接服务,当模拟器客户端断开连接,CPU使用率就会迅速增长到8

merge语句导致的CPU使用率过高的优化(二)

之前分享过一篇关于merge语句导致的CPU使用率过高优化的案例.的http://blog.itpub.net/23718752/viewspace-1819471/ 后续的跟进没有补充,也"秀"一张图,红色的火焰是原来的系统负载,右边的部分是最近的逻辑读情况,不过惭愧的是,这个不是优化的效果,因为应用的高峰期已经处理完了,后面的sql调用频率极低,所以感觉不到任何的压力.所以通过这个图也可以看出,给一张差别巨大的图也不一定是系统优化的效果,也可能是其它外在因素. 那么既然要说跟进,后

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失

摘要 CPU高使用率往往会导致SQL Server服务响应缓慢,查询超时,甚至服务挂起僵死,可以说CPU高使用率是数据库这种后台进程服务的第一大杀手.本系列文章之一的"索引缺失"就是CPU高使用率的最常见的原因之一. 问题引入 "鸟啊,我们平时在服务阿里云RDS SQL Server客户的过程中,遇到最多的一个问题就是,客户反馈RDS SQL Server数据库CPU使用率很高(有时超过90%,甚至到100%),导致查询缓慢甚至超时,这类问题要如何解决啊?".老鸟已

.net-服务器CPU使用率高如何优化?

问题描述 服务器CPU使用率高如何优化? .net网站多用户同时访问导致服务器CPU使用率过高该怎么优化啊?才模拟了10个用户就94%了-用的虚拟空间,大家有什么优化建议呢?在此谢过各位大神了! 解决方案 这个问题需要具体分析一下.主要看项目运行的瓶颈在什么地方?1.业务层的计算?2数据库的数据处理 3,是否站用CPU进行绘图,文件输出等.然后看是否进行进一步的优化.针对分析出的结果然后找对应的解决方案.

RDS SQL Server - 最佳实践 - 高CPU使用率系列之二索引碎片

摘要 上一篇文章分析了高CPU使用率的原因之一是索引缺失,接下来本系列文章之二的"索引碎片"是CPU高使用率的又一常见的原因.解决索引碎片问题是解决SQL Server服务响应缓慢,查询超时的又一利器. 问题引入 "鸟哥,我上一篇文章分享了因为索引缺失导致CPU高使用率的话题,反响不错.接下来,我打算分享索引碎片导致CPU高使用率的话题.",菜鸟主动找到老鸟汇报工作. 上一篇文章详情参见链接:RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺

merge语句导致的CPU使用率过高的优化

今天有一个数据库有点反常,早上的时候报出了CPU使用率的警告. 警告内容如下: ZABBIX-监控系统: ------------------------------------报警内容: CPU utilization is too high ------------------------------------报警级别: PROBLEM ------------------------------------监控项目: CPU idle time:44.61 % -------------

运行效率-为程序分配更多系统资源,或者说怎样提高一个程序的cpu使用率?

问题描述 为程序分配更多系统资源,或者说怎样提高一个程序的cpu使用率? 写了一个图像识别程序,就是运行效率太低,想给程序分配更多的cpu时间让他运行快点. 那些大型游戏是采用什么机制能够占那么多的系统资源的? 解决方案 采用多线程.如果你不用多线程,你只能用 1/计算机逻辑cpu数量 的cpu占用率. 解决方案二: 也要看语言的,像Java/C语言都是可以100%调用CPU的,而Python是不能的,. 解决方案三: 1.多线程,比如线程1处理第一部分,线程2处理第二部分,,,协调好,另外如果

explorer.exe进程造成CPU使用率占用100%

问:我的电脑explorer.exe进程造成CPU使用率占用100%,我应该怎么办? 答:在system.ini文件中,在[BOOT]下面有个"shell=文件名".正确的文件名应该是"explorer.exe",假如不是"explorer.exe",而是"shell= explorer.exe 程序名",那幺后面跟着的那个程序就是"木马"程序,就是说你已经中"木马"了. 在注册表中的情

CPU使用率高怎么办?

  CPU使用率高怎么办?            当出现由于CPU资源不足,往往很容易导致电脑卡或者无响应等情况. 那么针对CPU使用率高怎么办? 网上关于'cpu使用率忽高忽低不稳定'这个话题讨论很多,其实都是从两个方面去考虑:一个是软件方面,另外一个则是硬件方面,其中硬件方面其决定性因素. 下面就跟系统大全一起来详细了解分析下,是什么原因造成的'cpu使用率100%'以及'cpu使用率不稳定'.