求助!获得CPU的利用率?

zhengjinlj 2003-11-19 04:24:52
请教,用Win32 API函数怎样获得CPU的利用率?我只知道用GlobalMemoryStatus可以获得内存的利用率。谢谢了!
...全文
39 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluebohe 2003-12-31
  • 打赏
  • 举报
回复
占用率



// cpusagent.cpp (Windows NT/2000)

//

// Getting the CPU usage in percent on Windows NT/2000

//

// (c)2000 Ashot Oganesyan K, SmartLine, Inc

// mailto:ashot@aha.ru, http://www.protect-me.com, http://www.codepile.com



#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%3d%%",(UINT)dbIdleTime);

}



// store new CPU's idle and system time

liOldIdleTime = SysPerfInfo.liIdleTime;

liOldSystemTime = SysTimeInfo.liKeSystemTime;



// wait one second

Sleep(1000);

}

printf("\n");

}

alphapiao 2003-12-31
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/findcode.asp
很多例子,自己看吧
changlele 2003-12-31
  • 打赏
  • 举报
回复
我有这种程序,给我发邮件,
chengyao.diao@hns-soft.com,今天晚上传给你
好用就结贴
langraser 2003-12-31
  • 打赏
  • 举报
回复
我顶~~
icuc88 2003-11-19
  • 打赏
  • 举报
回复
给你转到VC板块。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧