RAM Disk 사용량 가져오기(WPF)

C++ 공부중·2024년 8월 19일
0

WPF

목록 보기
12/18

내가 필요할때 보기 위한 메모!

RAM 과 Disk의 사용량같은 경우 ServerUI를 만들대 사용하게되었다.
혹여 다시 필요할일이 있을까해서 저장해놓는것

RAM 데이터를 가져오는 함수

아래의 코드는 MB 단위로 반환해서 값을 가져와준다.


private float GetRamUsage()
{
    // 현재 프로세스의 메모리 사용량을 MB 단위로 반환
    var currentProcess = Process.GetCurrentProcess();
    return currentProcess.PrivateMemorySize64 / (1024 * 1024);
}

Disk 데이터를 가져오는 함수

아래의 코드는 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;
 }

Data Chart 사용해보기

LiveChart

반원형 차트 그리기

사용하기위한 설치 명령어

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;
            }
        }
    }
profile
이것저것 공부하는중

0개의 댓글