Ramesh Balasubramani Ответов: 3

Как получить информацию о процессоре, оперативной памяти и диске моей машины?


Как получить информацию о процессоре моей машины, оперативной памяти и диске.

Пример:

Процессор - 50% используется,
Оперативная память - 80% используется,
Диск - 80% используется.

Что я уже пробовал:

public static string GetUsedDisk() // This one working fine
        {
            double TotalDiskSize = 0;
            double AvailableDiskSize = 0;
            double UsedDiskSize = 0;
            double UsedDiskSizePercent = 0;
            DriveInfo[] drives = DriveInfo.GetDrives();

            foreach (DriveInfo drive in drives)
            {
                if (drive.IsReady)
                {
                    TotalDiskSize += drive.TotalSize;
                    AvailableDiskSize += drive.AvailableFreeSpace;
                }
            }
            UsedDiskSize = TotalDiskSize - AvailableDiskSize;
            UsedDiskSizePercent = (UsedDiskSize / TotalDiskSize) * 100;
            return String.Format("{0:0.00}", UsedDiskSizePercent);
        }

 public static string GetUsedRAM()// This one working fine
        {
            PerformanceCounter RAMCounter;
            RAMCounter = new PerformanceCounter();
            RAMCounter.CategoryName = "Memory";
            RAMCounter.CounterName = "% Committed Bytes In Use";
            return String.Format("{0:0.00}", RAMCounter.NextValue());
        }

// This one not working It always gives 0% Please Help 
  public static string GetUsedCPU()        {
            PerformanceCounter CPUCounter;
            CPUCounter = new PerformanceCounter();
            CPUCounter.CategoryName = "Processor";
            CPUCounter.CounterName = "% Processor Time";
            CPUCounter.InstanceName = "_Total";
            return String.Format("{0:0.00}", CPUCounter.NextValue());
        }

Пожалуйста, Помогите Этому Методу GetUsedCPU()

3 Ответов

Рейтинг:
8

Ramesh Balasubramani

public static string GetUsedDisk() 
        {
            double TotalDiskSize = 0;
            double AvailableDiskSize = 0;
            double UsedDiskSize = 0;
            double UsedDiskSizePercent = 0;
            DriveInfo[] drives = DriveInfo.GetDrives();

            foreach (DriveInfo drive in drives)
            {
                if (drive.IsReady)
                {
                    TotalDiskSize += drive.TotalSize;
                    AvailableDiskSize += drive.AvailableFreeSpace;
                }
            }
            UsedDiskSize = TotalDiskSize - AvailableDiskSize;
            UsedDiskSizePercent = (UsedDiskSize / TotalDiskSize) * 100;
            return String.Format("{0:0.00}", UsedDiskSizePercent);
        }

 public static string GetUsedRAM()
        {
            PerformanceCounter RAMCounter;
            RAMCounter = new PerformanceCounter();
            RAMCounter.CategoryName = "Memory";
            RAMCounter.CounterName = "% Committed Bytes In Use";
            return String.Format("{0:0.00}", RAMCounter.NextValue());
        }


  public static string GetUsedCPU()        {
            PerformanceCounter CPUCounter;
            CPUCounter = new PerformanceCounter();
            CPUCounter.CategoryName = "Processor";
            CPUCounter.CounterName = "% Processor Time";
            CPUCounter.InstanceName = "_Total";
            CPUCounter.NextValue()
            System.Threading.Thread.Sleep(1000);
            return String.Format("{0:0.00}", CPUCounter.NextValue());
        }


Рейтинг:
23

debasish mishra

For CPU Usage, use PerformanceCounter CLass from System.Diagnostics.

For example.

PerformanceCounter cpu;
PerformanceCounter ramr;

cpu = new PerformanceCounter();
cpu.CategoryName = "Processor";
cpu.CounterName = "% Processor Time";
cpu.InstanceName = "_Total";

ram = new PerformanceCounter("Memory", "Available MBytes");


public string getCurrentCpuUsage()
{
            cpu.NextValue()+"%";
}

public string getAvailableRAM()
{
            ramCounter.NextValue()+"MB";
}


For Disk usage here is a sample program.

Using System.IO;
using System;

class Info {
    public static void Main() {
        DriveInfo[] drives = DriveInfo.GetDrives();
        foreach (DriveInfo drive in drives) {
            //There are more attributes you can use.
            //Check the MSDN link for a complete example.
            Console.WriteLine(drive.Name);
            if (drive.IsReady) Console.WriteLine(drive.TotalSize);
        }
    }
}



Этот код может вызвать проблемы с компиляцией,поэтому не копируйте вставку напрямую.Это подход, описанный здесь.Вы можете проголосовать за это решение, если оно ответит на ваши сомнения.


[no name]

публичная статическая строка GetUsedCPU()// эта не работает, она всегда дает 0%
{
PerformanceCounter CPUCounter;
CPUCounter = новый PerformanceCounter();
CPUCounter.CategoryName = "Процессор";
CPUCounter.CounterName = "% Процессорного Времени";
CPUCounter.InstanceName = "_Total";
возвращенная строка.Формат("{0:0.00}", CPUCounter.NextValue());
}


Этот не работает пожалуйста помогите мне

[no name]

Пожалуйста, посмотрите ниже решение, опубликованное Йохеном

[no name]

Я считаю, что если вы попробуете это сделать, то он часто будет сообщать 0, причина в том, что объект счетчика производительности нуждается в 2 значениях, чтобы дать точное считывание. Это может привести вас к мысли, что вставка cpuCounter.NextValue() перед возвращаемой строкой устранит проблему, однако это не так. Эти счетчики, как правило, обновляются только один или два раза в секунду, поэтому вызов его дважды подряд, скорее всего, просто вернет одно и то же значение.

Просто напишите ниже две строки
CPUCounter.NextValue();
Система.Нарезание резьбы.Нить.Спать(1000);
выше нижней линии.
возвращенная строка.Формат("{0:0.00}", CPUCounter.NextValue());

[no name]

Потрясающе !!!!!

Большое Вам Спасибо, Мой Дорогой Друг.

Рейтинг:
17

Jochen Arndt

Это anwser для обновленного вопроса, где загрузка процессора всегда равна нулю.

Многие Класс PerformanceCounter (System.Диагностика)[^] значения зависят от двух чтений. Это означает, что после PerformanceCounter экземпляр был создан, Метод PerformanceCounter.NextValue (System.Диагностика)[^] должен быть вызван один раз после создания, игнорируя возвращаемое значение. Следующие вызовы затем вернут значение для времени между вызовами.

Так что вы должны сделать свой выбор. CPUCounter статический член класса (например, класс вашего приложения), инициализируйте его и вызовите NextValue() однажды. Потом дальше NextValue() вызовы должны возвращать ненулевые значения.

См. также пример кода приведенных выше ссылок MSDN и эту заметку в разделе NextValue() документация:

Цитата:
Если вычисленное значение счетчика зависит от двух операций чтения счетчика, то первая операция чтения возвращает 0.0. сброс свойств счетчика производительности для указания другого счетчика эквивалентен созданию нового счетчика производительности, а первая операция чтения с использованием новых свойств возвращает 0.0. Рекомендуемое время задержки между вызовами метода NextValue составляет одну секунду, чтобы счетчик мог выполнить следующее инкрементное считывание.