VC++获取CPU使用率及信息

 

#include <StdAfx.h>
#include <windows.h>
#include <conio.h>
#include <stdio.h>

#define SystemBasicInformation 0
#define SystemPerformanceInformation 2
#define SystemTimeInformation 3

#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))

typedef struct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
} SYSTEM_BASIC_INFORMATION;

typedef struct
{
LARGE_INTEGER liIdleTime;
DWORD dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;

typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;


// ntdll!NtQuerySystemInformation (NT specific!)
//
// The function copies the system information of the
// specified type into a buffer
//
// NTSYSAPI
// NTSTATUS
// NTAPI
// NtQuerySystemInformation(
// IN UINT SystemInformationClass, // information type
// OUT PVOID SystemInformation, // pointer to buffer
// IN ULONG SystemInformationLength, // buffer size in bytes
// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit
// // variable that receives
// // the number of bytes
// // written to the buffer
// );
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

PROCNTQSI NtQuerySystemInformation;


void main(void)
{
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIME_INFORMATION SysTimeInfo;
SYSTEM_BASIC_INFORMATION SysBaseInfo;
double dbIdleTime;
double dbSystemTime;
LONG status;
LARGE_INTEGER liOldIdleTime = {0,0};
LARGE_INTEGER liOldSystemTime = {0,0};

NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation");

if (!NtQuerySystemInformation)
return;

// get number of processors in the system
status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
return;

printf("\nCPU Usage (press any key to exit): ");
while(!_kbhit())
{
// get new system time
status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
if (status!=NO_ERROR)
return;

// get new CPU's idle time
status =NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status != NO_ERROR)
return;

// if it's a first call - skip it
if (liOldIdleTime.QuadPart != 0)
{
// CurrentValue = NewValue - OldValue
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) -

Li2Double(liOldSystemTime);

// CurrentCpuIdle = IdleTime / SystemTime
dbIdleTime = dbIdleTime / dbSystemTime;

// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 /

(double)SysBaseInfo.bKeNumberProcessors + 0.5;

printf("\b\b\b\b=%%",(UINT)dbIdleTime);
}

// store new CPU's idle and system time
liOldIdleTime = SysPerfInfo.liIdleTime;
liOldSystemTime = SysTimeInfo.liKeSystemTime;

// wait one second
Sleep(1000);
}
printf("\n");
}


 

 

BOOL GetProcessorInfo(LPPROCESSOR_INFO lpProcessorInfo)

{

SYSTEM_INFO SystemInfo;

GetSystemInfo(&SystemInfo);

m_ProcessBaseInfo.dwNumberOfProcessors = SystemInfo.dwNumberOfProcessors;

m_ProcessBaseInfo.dwProcessorType = SystemInfo.dwProcessorType;


if(m_pProcessorOldTime == NULL)

{

m_pProcessorOldTime = new PROCESSORTIME_INFO[m_ProcessBaseInfo.dwNumberOfProcessors];

memset(m_pProcessorOldTime,0,sizeof(PROCESSORTIME_INFO) * m_ProcessBaseInfo.dwNumberOfProcessors);

}


memcpy(lpProcessorInfo,&m_ProcessBaseInfo,sizeof(m_ProcessBaseInfo));

return TRUE;

}

//内存的使用率

 

 

BOOL GetMemStatus(LPMEM_STATUS lpStatus)

{

MEMORYSTATUS state;

state.dwLength = sizeof(state);

GlobalMemoryStatus(&state);

memcpy(lpStatus,&(state.dwMemoryLoad),sizeof(MEM_STATUS));

return TRUE;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include "StdAfx.h" #include "cpuassembly.h" // bit flags set by cpuid when called with register eax set to 1 #define MMX_SUPPORTED 0x00800000 #define SSE_SUPPORTED 0x02000000 #define SSE2_SUPPORTED 0x04000000 #define AMD_3DNOW_SUPPORTED 0x80000000 // AMD specific #define AMD_3DNOW_EX_SUPPORTED 0x40000000 #define AMD_MMX_EX_SUPPORTED 0x00400000 #define SUPPORT_MMX 0x0001 #define SUPPORT_3DNOW 0x0002 #define SUPPORT_SSE 0x0004 #define SUPPORT_SSE2 0x0008 CPUAssembly::CPUAssembly(void) { memset(&sCPUInfo, 0, sizeof(sCPUInfo)); } CPUAssembly::~CPUAssembly(void) { } bool CPUAssembly::IsCPUID() const { __try { _asm { xor eax, eax cpuid } } __except (EXCEPTION_EXECUTE_HANDLER) { return false; } return true; } bool CPUAssembly::QueryCPUInfo() { if (!IsCPUID()) return false; memset(&sCPUInfo, 0, sizeof(sCPUInfo)); DWORD dwStandard = 0; DWORD dwFeature = 0; DWORD dwMax = 0; DWORD dwExt = 0; int feature = 0; int os_support = 0; union { char cBuffer[12+1]; struct { DWORD dw0; DWORD dw1; DWORD dw2; } stc; } Vendor; memset(&Vendor, 0, sizeof(Vendor)); _asm { push ebx push ecx push edx // get the vendor string xor eax, eax cpuid mov dwMax, eax mov Vendor.stc.dw0, ebx mov Vendor.stc.dw1, edx mov Vendor.stc.dw2, ecx // get the Standard bits mov eax, 1 cpuid mov dwStandard, eax mov dwFeature, edx // get AMD-specials mov eax, 80000000h cpuid cmp eax, 80000000h jc notamd mov eax, 80000001h cpuid mov dwExt, edx notamd: pop ecx pop ebx pop edx } if (dwFeature & MMX_SUPPORTED) sCPUInfo.dwFeatures |= SUPPORT_MMX; if (dwExt & AMD_3DNOW_SUPPORTED) sCPUInfo.dwFeatures |= SUPPORT_3DNOW; if (dwFeature & SSE_SUPPORTED) sCPUInfo.dwFeatures |= SUPPORT_SSE; if (dwFeature & SSE2_SUPPORTED) sCPUInfo.dwFeatures |= SUPPORT_SSE2; sCPUInfo.iFamily = (short int)((dwStandard >> 8) & 0xF); // retrieve family if (sCPUInfo.iFamily == 15) // retrieve extended family sCPUInfo.iFamilyEx = (dwStandard >> 16) & 0xFF0; sCPUInfo.iModel = (short int)((dwStandard >> 4) & 0xF); // retrieve model if (sCPUInfo.iModel == 15) // retrieve extended model sCPUInfo.iModelEx = (dwStandard >> 12) & 0xF; sCPUInfo.iStepping = (short int)((dwStandard) & 0xF); // retrieve stepping strcpy(sCPUInfo.sVendorName, Vendor.cBuffer); sCPUInfo.iSpeed = ICPUInfo::GetSpeed(); strcpy(sCPUInfo.sProcessorName, ICPUInfo::GetCPUName(sCPUInfo.sVendorName, sCPUInfo.iFamily, sCPUInfo.iModel, sCPUInfo.iFamilyEx, sCPUInfo.iModelEx).c_str()); return true; } unsigned int CPUAssembly::GetSpeedMHz() const { return (unsigned int)(sCPUInfo.iSpeed/(1024*1024)); } std::string CPUAssembly::GetCPUName() const { return sCPUInfo.sProcessorName; } std::string CPUAssembly::GetVendorName() const { return sCPUInfo.sVendorName; } short int CPUAssembly::GetCPUFamily() const { return sCPUInfo.iFamily; } short int CPUAssembly::GetCPUModel() const { return sCPUInfo.iModel; } short int CPUAssembly::GetCPUStepping() const { return sCPUInfo.iStepping; } bool CPUAssembly::IsMMXSupported() const { return ((sCPUInfo.dwFeatures & SUPPORT_MMX) == SUPPORT_MMX); } bool CPUAssembly::IsSSESupported() const { return ((sCPUInfo.dwFeatures & SUPPORT_SSE) == SUPPORT_SSE); } bool CPUAssembly::IsSSE2Supported() const { return ((sCPUInfo.dwFeatures & SUPPORT_SSE2) == SUPPORT_SSE2); } bool CPUAssembly::Is3DNowSupported() const { return ((sCPUInfo.dwFeatures & SUPPORT_3DNOW) == SUPPORT_3DNOW); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值