获取windows运行状态信息

CPU

    有时候要知道CPU的占有率,NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(GetModuleHandle(TEXT("ntdll")), "NtQuerySystemInformation");这个方式在WIN7有问题,现在使用GetSystemTimes来获取CPU的占有率。
原理:CPU利用率定义为;用户进程时间 / (用户进程时间 + 内核时间)。
GetSystemTimes的解释:
BOOL WINAPI GetSystemTimes(
 __out_opt LPFILETIME lpIdleTime,
 __out_opt LPFILETIME lpKernelTime,
 __out_opt LPFILETIME lpUserTime
);
    To compile an application that uses this function, define _WIN32_WINNT as 0x0501 or later. For more information。本函数返回系统时序信息,在多核处理器环境下,返回值为所有核心的求和。
    本函数返回3个时间信息,分别是空闲时间、内核时间、用户进程时间。windows系统处于空闲时会运行SystemIdle进程,该进程运行在内核态,因此空闲时间位于内核时间内。
FILETIME
本数据结构定位如下:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
    FILETIME数据结构为一个64位数据,它表示从1601年1月1日起,距离现在100纳米时间单位的数量。

#define _WIN32_WINNT   0x0501
#include <windows.h>

__int64 CompareFileTime ( FILETIME time1, FILETIME time2 )
{
 __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime ;
 __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime ;

 return   (b - a);
}

int _tmain(int argc, _TCHAR* argv[])
{
 BOOL res ;

 FILETIME preidleTime;
 FILETIME prekernelTime;
 FILETIME preuserTime;

 FILETIME idleTime;
 FILETIME kernelTime;
 FILETIME userTime;

 res = GetSystemTimes( &idleTime, &kernelTime, &userTime );

 preidleTime = idleTime;
 prekernelTime = kernelTime;
 preuserTime = userTime ;

 while (1){

  Sleep(1000);
  res = GetSystemTimes( &idleTime, &kernelTime, &userTime );

  int idle = CompareFileTime( preidleTime,idleTime);
  int kernel = CompareFileTime( prekernelTime, kernelTime);
  int user = CompareFileTime(preuserTime, userTime);

  int cpu = (user) *100/(kernel+user);
  printf("cpu per %d\n",cpu);

  preidleTime = idleTime;
  prekernelTime = kernelTime;
  preuserTime = userTime ;
 }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值