C# 如何在c语言中获得CPU频率#
我如何获得CPU频率(例如:2Ghz)的c值? 这很简单,但我在环境变量中找不到。 谢谢:)试试这段代码C# 如何在c语言中获得CPU频率#,c#,cpu,frequency,C#,Cpu,Frequency,我如何获得CPU频率(例如:2Ghz)的c值? 这很简单,但我在环境变量中找不到。 谢谢:)试试这段代码 using System.Management; uint currentsp , Maxsp; public void CPUSpeed() { using(ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'")) { currentsp = (uint)(Mo[
using System.Management;
uint currentsp , Maxsp;
public void CPUSpeed()
{
using(ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'"))
{
currentsp = (uint)(Mo["CurrentClockSpeed"]);
Maxsp = (uint)(Mo["MaxClockSpeed"]);
}
}
试试这个代码
using System.Management;
uint currentsp , Maxsp;
public void CPUSpeed()
{
using(ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'"))
{
currentsp = (uint)(Mo["CurrentClockSpeed"]);
Maxsp = (uint)(Mo["MaxClockSpeed"]);
}
}
人们可以从注册表中取出这些信息,但不知道它是否适用于Windows XP或更早版本(我的是Windows 7) 读起来像
Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
对我来说
类似这样的代码可以检索信息(未测试):
(来源:)人们可以从注册表中取出这些信息,但不知道它是否适用于Windows XP或更早版本(我的是Windows 7) 读起来像
Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
对我来说
类似这样的代码可以检索信息(未测试):
(来源:)
如果你想获得其他字段,请查看类
如果您希望获取其他字段,请查看类,您可以通过WMI获取该字段,但速度非常慢,因此如果您不止一次获取该字段,我建议您将其缓存—类似于:
namespace Helpers
{
using System.Management;
public static class HardwareHelpers
{
private static uint? maxCpuSpeed = null;
public static uint MaxCpuSpeed
{
get
{
return maxCpuSpeed.HasValue ? maxCpuSpeed.Value : (maxCpuSpeed = GetMaxCpuSpeed()).Value;
}
}
private static uint GetMaxCpuSpeed()
{
using (var managementObject = new ManagementObject("Win32_Processor.DeviceID='CPU0'"))
{
var sp = (uint)(managementObject["MaxClockSpeed"]);
return sp;
}
}
}
}
您可以通过WMI获取它,但它的速度非常慢,因此,如果您不止一次获取它,我建议您将其缓存—类似于:
namespace Helpers
{
using System.Management;
public static class HardwareHelpers
{
private static uint? maxCpuSpeed = null;
public static uint MaxCpuSpeed
{
get
{
return maxCpuSpeed.HasValue ? maxCpuSpeed.Value : (maxCpuSpeed = GetMaxCpuSpeed()).Value;
}
}
private static uint GetMaxCpuSpeed()
{
using (var managementObject = new ManagementObject("Win32_Processor.DeviceID='CPU0'"))
{
var sp = (uint)(managementObject["MaxClockSpeed"]);
return sp;
}
}
}
}
如果要获得涡轮转速,可以使用“%Processor Performance”性能计数器并将其与WMI“MaxClockSpeed”相乘,如下所示:
private string GetCPUInfo()
{
PerformanceCounter cpuCounter = new PerformanceCounter("Processor Information", "% Processor Performance", "_Total");
double cpuValue = cpuCounter.NextValue();
Thread loop = new Thread(() => InfiniteLoop());
loop.Start();
Thread.Sleep(1000);
cpuValue = cpuCounter.NextValue();
loop.Abort();
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT *, Name FROM Win32_Processor").Get())
{
double maxSpeed = Convert.ToDouble(obj["MaxClockSpeed"]) / 1000;
double turboSpeed = maxSpeed * cpuValue / 100;
return string.Format("{0} Running at {1:0.00}Ghz, Turbo Speed: {2:0.00}Ghz", obj["Name"], maxSpeed, turboSpeed);
}
return string.Empty;
}
InfiniteLop方法只是一个加1减1的整数:
private void InfiniteLoop()
{
int i = 0;
while (true)
i = i + 1 - 1;
}
添加InfiniteLoop方法只是为了给CPU一些事情做,并在这个过程中加快速度。允许循环运行一秒钟,然后取下一个值并中止循环。如果要获得涡轮转速,可以使用“%Processor Performance”性能计数器并将其与WMI“MaxClockSpeed”相乘,如下所示:
private string GetCPUInfo()
{
PerformanceCounter cpuCounter = new PerformanceCounter("Processor Information", "% Processor Performance", "_Total");
double cpuValue = cpuCounter.NextValue();
Thread loop = new Thread(() => InfiniteLoop());
loop.Start();
Thread.Sleep(1000);
cpuValue = cpuCounter.NextValue();
loop.Abort();
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT *, Name FROM Win32_Processor").Get())
{
double maxSpeed = Convert.ToDouble(obj["MaxClockSpeed"]) / 1000;
double turboSpeed = maxSpeed * cpuValue / 100;
return string.Format("{0} Running at {1:0.00}Ghz, Turbo Speed: {2:0.00}Ghz", obj["Name"], maxSpeed, turboSpeed);
}
return string.Empty;
}
InfiniteLop方法只是一个加1减1的整数:
private void InfiniteLoop()
{
int i = 0;
while (true)
i = i + 1 - 1;
}
添加InfiniteLoop方法只是为了给CPU一些事情做,并在这个过程中加快速度。允许循环运行一秒钟,然后取下一个值并中止循环。您指的是哪个频率?当前的还是最大的?你指的是哪个频率?当前值或最大值?
CurrentClockSpeed
听起来像当前值,而不是最大值:)您应该使用dispose语句。使用(ManagementObject Mo=new ManagementObject(“Win32_Processor.DeviceID='CPU0')){…}@Matten只需将CurrentClockSpeed替换为MaxClockSpeed即可done@ChakerNakhli——好的,那么这是一个更好的解决方案,我不建议使用ManagementObject,因为它太慢了。它最多需要1秒,而ManagementObjectSearcher在100ms内完成同样的操作。Microsoft建议使用ManagementClass而不是ManagementObject,因为它可以解决性能问题,尽管有些问题无法解决。例如,“Win32_Processor.DeviceID='CPU0'”CurrentClockSpeed
听起来像是当前的,而不是最大值:)您应该使用dispose语句。使用(ManagementObject Mo=new ManagementObject(“Win32_Processor.DeviceID='CPU0')){…}@Matten只需将CurrentClockSpeed替换为MaxClockSpeed即可done@ChakerNakhli——好的,那么这是一个更好的解决方案,我不建议使用ManagementObject,因为它太慢了。它最多需要1秒,而ManagementObjectSearcher在100ms内完成同样的操作。Microsoft建议使用ManagementClass而不是ManagementObject,因为它可以解决性能问题,尽管有些问题无法解决。例如,“Win32_Processor.DeviceID='CPU0'”您希望它以Ghz为单位?似乎以MHz为单位返回MaxClockSpeed数据类型:uint32访问类型:只读限定符:单位(兆赫)我这样做是为了转换它,var clockSpeed=0.001f*(uint)项[“MaxClockSpeed”]代码>您希望它以Ghz为单位?似乎以MHz为单位返回MaxClockSpeed数据类型:uint32访问类型:只读限定符:单位(兆赫)我这样做是为了转换它,var clockSpeed=0.001f*(uint)项[“MaxClockSpeed”]代码>谢谢-与CurrentClockSpeed查询不同,这实际上提供了实际的当前处理器频率。我删除InfiniteLop是因为我感兴趣的是当前状态,而不是最大可能频率谢谢-与CurrentClockSpeed查询不同,这实际上提供了实际的当前处理器频率。我删除infiniteloop是因为我对当前状态感兴趣,而不是最大可能频率