windows 获取系统CPU和进程CPU 内存等信息
生活随笔
收集整理的這篇文章主要介紹了
windows 获取系统CPU和进程CPU 内存等信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#ifndef __GETSYSTEM_INFO_H
#define __GETSYSTEM_INFO_H#include "psapi.h"
#include "tlhelp32.h"typedef struct PROCESS_INFO_T
{int memUsage; //內存使用率int threadNum; //線程數int TotalMemSize; //總內存int MemSize; //內存使用量int VirtualMem; //虛擬內存的使用int handleCount; //句柄的數量int SyscpuUsage; //系統的cpu利用率float ProcpuUsage; //進程的cpu利用率PROCESS_INFO_T(){memUsage = 0 ;threadNum = 0;MemSize = 0;TotalMemSize = 0;VirtualMem = 0;handleCount = 0;SyscpuUsage = 0;ProcpuUsage = 0.0;}}PROCESS_INFO;
class DagSystemInfo:public singleton<DagSystemInfo>
{
public:DagSystemInfo(void);~DagSystemInfo(void);void init(void);void GetSysInfo(PROCESS_INFO& info);static void S_CheckCpuUsage(void* arg);void CheckCpuUsage(void);private:int GetThreadNum(void);__int64 m_syscpu; // 系統CPU利用率float m_Procpu; // 進程CPU利用率
};#endif
#include "DagSystemInfo.h"DagSystemInfo::DagSystemInfo(void)
{}DagSystemInfo::~DagSystemInfo(void)
{
}int DagSystemInfo::GetThreadNum(void)
{int iThreadNum = 0;HANDLE hSnapshort = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if(INVALID_HANDLE_VALUE == hSnapshort) { return 0; } THREADENTRY32 stcThreadInfo; stcThreadInfo.dwSize = sizeof(stcThreadInfo);DWORD iCurProcessID = GetCurrentProcessId();for(BOOL bRet = Thread32First(hSnapshort, &stcThreadInfo); bRet != FALSE; bRet = Thread32Next(hSnapshort, &stcThreadInfo)){if(stcThreadInfo.th32OwnerProcessID == iCurProcessID){iThreadNum ++;}}CloseHandle(hSnapshort);return iThreadNum;
}void DagSystemInfo::S_CheckCpuUsage(void* arg)
{DagSystemInfo* pDagSysInfo = (DagSystemInfo*)arg;pDagSysInfo->CheckCpuUsage();
}__int64 CompareFileTime(FILETIME time1, FILETIME time2)
{ __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime; __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime; return (b - a);
} /// 時間轉換
static uint64_t file_time_2_utc(const FILETIME* ftime)
{ LARGE_INTEGER li; li.LowPart = ftime->dwLowDateTime; li.HighPart = ftime->dwHighDateTime; return li.QuadPart;
} void DagSystemInfo::CheckCpuUsage()
{HANDLE hEvent; BOOL res; FILETIME preidleTime; FILETIME prekernelTime; FILETIME preuserTime; FILETIME idleTime; FILETIME kernelTime; FILETIME userTime; FILETIME creation_time;FILETIME exit_time;FILETIME kernel_time;FILETIME user_time;FILETIME prekernel_time;FILETIME preuser_time;SYSTEM_INFO info; GetSystemInfo(&info); int cpuCount = info.dwNumberOfProcessors;res = GetSystemTimes(&idleTime, &kernelTime, &userTime); preidleTime = idleTime; prekernelTime = kernelTime; preuserTime = userTime; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessId());GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time, &user_time);prekernel_time = kernel_time;preuser_time = user_time;FILETIME now; GetSystemTimeAsFileTime(&now); __int64 last_system_time_ = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) / cpuCount; __int64 last_time_ = file_time_2_utc(&now);hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); while (true){ WaitForSingleObject(hEvent, 1000); res = GetSystemTimes(&idleTime, &kernelTime, &userTime); __int64 idle = CompareFileTime(preidleTime, idleTime); __int64 kernel = CompareFileTime(prekernelTime, kernelTime); __int64 user = CompareFileTime(preuserTime, userTime); m_syscpu= (kernel + user - idle) * 100 / (kernel + user); preidleTime = idleTime; prekernelTime = kernelTime; preuserTime = userTime; GetProcessTimes(hProcess, &creation_time, &exit_time, &kernel_time, &user_time);__int64 system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time))/ cpuCount;GetSystemTimeAsFileTime(&now); __int64 time = file_time_2_utc(&now);__int64 system_time_delta = system_time - last_system_time_;__int64 time_delta = time - last_time_;m_Procpu = (float)system_time_delta * 100 / (float)time_delta;last_system_time_ = system_time ;last_time_ = time;}
}void DagSystemInfo::GetSysInfo(PROCESS_INFO& info)
{info.threadNum = GetThreadNum();HANDLE hThread = ::GetCurrentProcess();MEMORYSTATUSEX statex;statex.dwLength = sizeof (statex);GlobalMemoryStatusEx (&statex);info.memUsage = statex.dwMemoryLoad;info.TotalMemSize = statex.ullTotalPhys / 1024 /1024 /1024;DWORD dwHandleCount;GetProcessHandleCount(hThread, &dwHandleCount);info.handleCount = dwHandleCount;PROCESS_MEMORY_COUNTERS pmc;GetProcessMemoryInfo(hThread,&pmc,sizeof(pmc));info.MemSize= pmc.WorkingSetSize/1024/1024;info.VirtualMem = pmc.PagefileUsage/1024/1024;info.SyscpuUsage = m_syscpu>100? 100:m_syscpu;info.ProcpuUsage = m_Procpu>100? 100:m_Procpu;;
}
總結
以上是生活随笔為你收集整理的windows 获取系统CPU和进程CPU 内存等信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下ioctl遇到的坑
- 下一篇: 工作中常用的正则表达式