使用WPF動態顯示CPU使用率


使用WPF動態顯示CPU使用率

 開源框架  admin  9個月前 (07-14)  1337瀏覽

使用WPF動態顯示CPU使用率

基於WPF的開源圖表控件有很多,大多數都是靜態圖表,如果需要繪制CPU使用率這樣的動態數據就顯得力不從心,微軟開源的DynamicDataDisplay控件彌補了這個不足,為了做個備忘,我用它來實時繪制CPU使用率曲線,當然,這個控件也可以繪制動態線圖、氣泡圖和熱力圖,具體可參閱官網示例代碼,使用方法非常簡單,下面就直接貼代碼,文本末尾提供VS2013的示例代碼下載。

1、首先需要在項目中引用DynamicDataDisplay.dll,該程序集可通過官網下載或者NuGet方式搜索獲去,在包控制台執行以下命令即可自動引用。

PM> Install-Package DynamicDataDisplay

2、在XAML文件中引用D3命名空間,同時添加一個名為ChartPlotter的圖表控件。

<Window x:Class="WpfCpuUsageSample.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="MainWindow" Loaded="Window_Loaded" Height="350" Width="525">
    <Grid>
        <d3:ChartPlotter Grid.Column="0" Grid.Row="0"  Name="plotter"/>
    </Grid>
</Window>

3、在后台窗體類中申明數據源ObservableDataSource用於為圖表控件提供數據,PerformanceCounter是性能計數器,可通過它來獲取CPU使用率,DispatcherTimer是一個基於WPF的計時器,支持在子線程異步通知UI線程,在窗口加載事件中初始化這些類,並未計時器綁定一個處理程序,用於獲取CPU使用率,並將當前的使用率加入到動態曲線中。

public partial class MainWindow : Window
{
    private ObservableDataSource<Point> dataSource = new ObservableDataSource<Point>();
    private PerformanceCounter performanceCounter = new PerformanceCounter();
    private DispatcherTimer dispatcherTimer = new DispatcherTimer();
    private int currentSecond = 0;

    public MainWindow()
    {
        InitializeComponent();
    }

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

    private void timer_Tick(object sender, EventArgs e)
    {
        performanceCounter.CategoryName = "Processor";
        performanceCounter.CounterName = "% Processor Time";
        performanceCounter.InstanceName = "_Total";

        double x = currentSecond;
        double y = performanceCounter.NextValue();

        Point point = new Point(x, y);
        dataSource.AppendAsync(base.Dispatcher, point);

        currentSecond++;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM