获取进程的信息的代码二

作者:BCB_FANS

前几日四大名捕云游四方,遍访各路大侠,有幸得到一高手指点,终于搞定。

====================================================================

一句话:在一个特定时间段内计算特定进程的总时间和所有进程的总时间,它们的比值就是那个特定进程的确CPU占有率,这里我采用1秒种。

====================================================================

typedef struct _THREAD_INFO
{
  LARGE_INTEGER CreateTime;
  DWORD dwUnknown1;
  DWORD dwStartAddress;
  DWORD StartEIP;
  DWORD dwOwnerPID;
  DWORD dwThreadId;
  DWORD dwCurrentPriority;
  DWORD dwBasePriority;
  DWORD dwContextSwitches;
  DWORD Unknown;
  DWORD WaitReason;

}THREADINFO, *PTHREADINFO;

typedef struct _UNICODE_STRING
{
    USHORT Length;
    USHORT MaxLength;
    PWSTR  Buffer;

} UNICODE_STRING;

typedef struct _PROCESS_INFO
{
  DWORD dwOffset;
  DWORD dwThreadsCount;
  DWORD dwUnused1[6];
  LARGE_INTEGER CreateTime;
  LARGE_INTEGER UserTime;
  LARGE_INTEGER KernelTime;
  UNICODE_STRING ProcessName;

  DWORD dwBasePriority;
  DWORD dwProcessID;
  DWORD dwParentProcessId;
  DWORD dwHandleCount;
  DWORD dwUnused3[2];

  DWORD dwVirtualBytesPeak;
  DWORD dwVirtualBytes;
  ULONG dwPageFaults;
  DWORD dwWorkingSetPeak;
  DWORD dwWorkingSet;
  DWORD dwQuotaPeakPagedPoolUsage;
  DWORD dwQuotaPagedPoolUsage;
  DWORD dwQuotaPeakNonPagedPoolUsage;
  DWORD dwQuotaNonPagedPoolUsage;
  DWORD dwPageFileUsage;
  DWORD dwPageFileUsagePeak;

  DWORD      dCommitCharge;
  THREADINFO ThreadSysInfo[1];

} PROCESSINFO, *PPROCESSINFO;


//每秒钟查询一次
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Button2Click(NULL);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  PVOID pProcInfo = NULL;
  DWORD dwInfoSize = 0x20000;
  PPROCESSINFO pProcessInfo;
  DWORD dwWorkingSet;
  long ( __stdcall *NtQuerySystemInformation )( DWORD, PVOID, DWORD, DWORD );


  static __int64 LastTotalProcessCPUUsage = 0;
  static __int64 LastCurrentProcessCPUUsage = 0;

  int CurrentDelta;
  int TotalDelta;

  __int64 TotalProcessCPUUsage = 0;
  __int64 CurrentProcessCPUUsage = 0;

  /////////////////////////////////

  pProcInfo = (PVOID)(new byte[dwInfoSize]);

  NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD))
          GetProcAddress( GetModuleHandle( "ntdll.dll" ),"NtQuerySystemInformation" );

  NtQuerySystemInformation(5,pProcInfo,dwInfoSize,0);

  pProcessInfo = (PPROCESSINFO)pProcInfo;

  do
  {
    TotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;

    if(pProcessInfo->dwProcessID == GetCurrentProcessId())
    {
      dwWorkingSet = pProcessInfo->dwWorkingSet;
      CurrentProcessCPUUsage  += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
    }

    /////////
    if(pProcessInfo->dwOffset == 0)
    {
      break;
    }
   
    pProcessInfo = (PPROCESSINFO)((byte*)pProcessInfo + pProcessInfo->dwOffset);
  }
  while(true);

  TotalDelta = TotalProcessCPUUsage - LastTotalProcessCPUUsage;
  CurrentDelta = CurrentProcessCPUUsage - LastCurrentProcessCPUUsage;

  if(TotalDelta != 0)
    this->Caption = "CPU = " + IntToStr(100 * CurrentDelta / TotalDelta) +
          "Memory = "+ IntToStr(dwWorkingSet / 1024) " K";

  LastTotalProcessCPUUsage = TotalProcessCPUUsage;
  LastCurrentProcessCPUUsage = CurrentProcessCPUUsage;

  delete[] pProcInfo;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值