• 某个正在运行的程序的CPU占用率


     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;  
      }  
       
      不知道你找到的是不是这个代码。这个程序是查寻自身CPU占用的,但其实他有能力查询所有的程序,请注意if(pProcessInfo->dwProcessID   ==   GetCurrentProcessId())这个地方。  
      要说CPU占用率,其实就是NtQuerySystemInformation查询,没什么关键的地方。
  • 相关阅读:
    C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)
    "Isa"与"Hasa"
    Access、SQLite、HSQLDB、Sybase、MySQL、DB4O比较
    C#反射(二)
    跳出语句
    C#反射(一)
    返回集合使用IEnumerable<>还是IList<>
    理解C#值类型与引用类型
    WF4 Beta2 工作原理
    Interesting thing with WF4 Activity Scheduling
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2422169.html
Copyright © 2020-2023  润新知