RAM 과 Disk의 사용량같은 경우 ServerUI를 만들대 사용하게되었다.
혹여 다시 필요할일이 있을까해서 저장해놓는것
아래의 코드는 MB 단위로 반환해서 값을 가져와준다.
private float GetRamUsage()
{
// 현재 프로세스의 메모리 사용량을 MB 단위로 반환
var currentProcess = Process.GetCurrentProcess();
return currentProcess.PrivateMemorySize64 / (1024 * 1024);
}
아래의 코드는 C드라이브의 사용량을 퍼센트로 계산해서 값을 가져오는 함수이다.
private float GetDiskUsage()
{
// C 드라이브의 사용량을 퍼센트로 계산
var driveInfo = DriveInfo.GetDrives().FirstOrDefault(d => d.Name == @"C:\");
if (driveInfo != null)
{
var usedSpace = driveInfo.TotalSize - driveInfo.AvailableFreeSpace;
return (float)usedSpace / driveInfo.TotalSize * 100;
}
return 0;
}
반원형 차트 그리기
Install-Package LiveCharts
Install-Package LiveCharts.Wpf
아래는 xaml 파일이다
<Window x:Class="RAM_and_Disk.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
Title="System Monitor" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<lvc:PieChart LegendLocation="Bottom" DataClick="Chart_OnDataClick" Hoverable="False" DataTooltip="{x:Null}">
<lvc:PieChart.Series>
<lvc:PieSeries Title="RAM Used" Values="{Binding RamUsed}" DataLabels="True"
LabelPoint="{Binding PointLabel}"/>
<lvc:PieSeries Title="RAM Free" Values="{Binding RamFree}" DataLabels="True"
LabelPoint="{Binding PointLabel}"/>
</lvc:PieChart.Series>
</lvc:PieChart>
</Grid>
<Grid Grid.Column="1">
<lvc:PieChart LegendLocation="Bottom" DataClick="Chart_OnDataClick" Hoverable="False" DataTooltip="{x:Null}">
<lvc:PieChart.Series>
<lvc:PieSeries Title="Disk Used" Values="{Binding DiskUsed}" DataLabels="True"
// Value는 PieChart에서 표현할 값을 넣어주는것
// LabelPoint는 퍼센트를 표기해준다.
LabelPoint="{Binding PointLabel}"/>
<lvc:PieSeries Title="Disk Free" Values="{Binding DiskFree}" DataLabels="True"
LabelPoint="{Binding PointLabel}"/>
</lvc:PieChart.Series>
</lvc:PieChart>
</Grid>
</Grid>
</Window>
아래의 코드는 xaml.cs 파일이다.
설명은 코드 중간중간 주석으로 작성하겟습니다.
using LiveCharts;
using LiveCharts.Wpf;
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Threading;
namespace RAM_and_Disk
{
public partial class MainWindow : Window
{
// 모델 부분 (변수선언)
public ChartValues<double> RamUsed { get; set; }
public ChartValues<double> RamFree { get; set; }
public ChartValues<double> DiskUsed { get; set; }
public ChartValues<double> DiskFree { get; set; }
private PerformanceCounter ramCounter;
private PerformanceCounter diskCounter;
private DispatcherTimer timer;
public MainWindow()
{
InitializeComponent();
RamUsed = new ChartValues<double> { 0 };
RamFree = new ChartValues<double> { 100 };
DiskUsed = new ChartValues<double> { 0 };
DiskFree = new ChartValues<double> { 100 };
/*PerformanceCounter 사용법
* 첫번째 인자 Performance Object (IP,Processor,WMI,Memory
* 두번째 인자 해당 Object의 카운터(Processor 인 경우 % Processor Time,% User Time, Thread Count)
* (Memory 인 경우 Available MByte,Available KByte
* 세번째 인자 프로세스의 이름
* cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); //new PerformanceCounter("Processor", "% Processor Time", appName);
* ramCounter = new PerformanceCounter("Memory", "% Committed Bytes In Use");
* diskCounter = new PerformanceCounter("LogicalDisk", "% Free Space", "_Total");
*/
ramCounter = new PerformanceCounter("Memory", "% Committed Bytes In Use");
diskCounter = new PerformanceCounter("LogicalDisk", "% Free Space", "_Total");
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
// 정해진 시간마다 Timer_Tick 을 호출한다.
timer.Tick += Timer_Tick;
timer.Start();
DataContext = this;
}
private void Timer_Tick(object sender, EventArgs e)
{
float ramUsage = ramCounter.NextValue();
float diskFree = diskCounter.NextValue();
// RamUsed, RamFree, DiskUsed, DiskFree 이렇게 4 변수에 소수점 둘째자리까지 반올림후 첫번째 요소로
// 집어넣는다. 그때마다 바인딩된 Value로 인해 Chart의수치가 자동으로 변동된다.
RamUsed[0] = Math.Round(ramUsage, 2);
RamFree[0] = Math.Round(100 - ramUsage, 2);
DiskUsed[0] = Math.Round(100 - diskFree, 2);
DiskFree[0] = Math.Round(diskFree, 2);
}
// 이 아래있는 코드가 ChartPint가 어떻게 쓰이게되는지 작성한 부분
public Func<ChartPoint, string> PointLabel { get; set; } = chartPoint => string.Format("{1:P}", chartPoint.Y, chartPoint.Participation);
// Chart_OnDataClick 코드는 차트를 클릭했을때 클릭한 부분이 Chart에서 약간 떨어지는 옵션이다. 굳이 필요없을지도
private void Chart_OnDataClick(object sender, ChartPoint chartpoint)
{
var chart = (LiveCharts.Wpf.PieChart)chartpoint.ChartView;
foreach (PieSeries series in chart.Series)
series.PushOut = 0;
var selectedSeries = (PieSeries)chartpoint.SeriesView;
selectedSeries.PushOut = 8;
}
}
}