【问题标题】:Using a chart to show my updated data per second on WPF使用图表显示我在 WPF 上每秒更新的数据
【发布时间】:2014-02-22 11:17:35
【问题描述】:

我正在尝试每秒获取 CPU 使用率。我已经为此设置了代码,所以那里没有问题。我试图在折线图上表示这些信息。我正在使用 wpf 工具包。我打算让图表有点类似于下图。 y 轴包含秒数,x 轴包含 cpu 使用率。

所以它就像图表上的秒数和 CPU 使用率一样不断更新。 (如果这不是一个好方法,我想要一些关于在图表上显示我的 CPU 使用率的更好方法的建议。)

我正在尝试找到一种方法来设置我的 dispatcherTimer,它每秒都在滴答作响,以便在 y 轴上更新。

这就是我当前图表的外观。

我对此一无所知,但我真的不确定如何将其设置为我正在寻找的东西。我相信我必须处理 pointcollection 值,但不能直接用 timer.tick (dispatchtimer) 替换数字。

图表代码如下:

<chartingToolkit:Chart Canvas.Left="25" Canvas.Top="307" Title="CPU Usage">
                    <chartingToolkit:Chart.DataContext>
                        <PointCollection>1,10 2,20 3,30 4,40</PointCollection>
                    </chartingToolkit:Chart.DataContext>
                    <chartingToolkit:LineSeries DependentValuePath="X" IndependentValuePath="Y" ItemsSource="{Binding}" Title="Cpu Usage">
                        <chartingToolkit:LineSeries.Background>
                            <RadialGradientBrush Center="0.075,0.015" GradientOrigin="-0.1,-0.1" RadiusY="0.9" RadiusX="1.05">
                                <GradientStop Color="#FFA9A3BD"/>
                                <GradientStop Color="#FF6C5B2C" Offset="1"/>
                            </RadialGradientBrush>
                        </chartingToolkit:LineSeries.Background>
                    </chartingToolkit:LineSeries>
                </chartingToolkit:Chart>

我知道这个问题很可能不清楚,但我不知道该怎么说。我也找不到任何指南参考。如果这有助于更好地理解,我可以发布我的代码来检索 CPU 使用结果(每秒)。不想用太多信息把问题搞得一团糟。感谢您的任何指导。

计算每秒 CPU 使用率的代码:

class Monitor
{
    Stats stats = new Stats();

    public delegate void CPUEventHandler(object sender, CPUEventArgs args);
    public event CPUEventHandler CPUEvent;

    DispatcherTimer timer = new DispatcherTimer();

    private static double cpuCurrent;

    public Monitor()
    {
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += TimeChanged;
        timer.Start();
    }

    void TriggerCPUEvent(CPUEventArgs args)
    {
        if (CPUEvent != null)
        {
            CPUEvent(this, args);
        }
    }

    public void TimeChanged(object sender, EventArgs e)
    {
        cpuCurrent = stats.GetCurrentCpuUsage();

        TriggerCPUEvent(new CPUEventArgs(cpuCurrent));
    }
}

class Stats
{
    private PerformanceCounter cpuCounter;

    public Stats()
    {
        cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    }

    public float GetCurrentCpuUsage()
    {
        return cpuCounter.NextValue();
    }
}

【问题讨论】:

  • 不要担心用代码“垃圾”这个问题。我们喜欢这里的那些东西! :)
  • 我已经编辑并添加了计算 CPU 使用率的代码部分。

标签: c# wpf xaml charts wpftoolkit


【解决方案1】:
  1. 定义数据模型以提供图表(在最简单的情况下为 ObservableCollection>)
  2. 在每次引发 TriggerCPUEvent 时添加一些逻辑以更新集合(从普通事件处理程序到 Reactive Extensions 聚合的各种选项) - 请注意集合的大小,因为如果您允许您的 WPF 图表不会执行得很好收藏无限增长
  3. 将您的系列系列绑定到底层集合,瞧!

如果您需要显示更大的数据块并保持良好的 UI 响应水平,请考虑编写自己的图表控件,直接与 DrawingContext 交互 - WPF Toolkit 图表不是性能最高的图表

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 2011-09-21
    • 2018-11-26
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多