如何实时获取系统每个进程占用的CPU

2016-02-19 17:41 64 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

  本文的目的是为了和大家讨论一个问题,同时给出一个根据进程ID,来返回该进程实时占用的CPU使用率的函数。希望大家在用这个函数的时候别忘记我的问题。

  目前计算进程CPU占用率的方法主要有两种,一种是根据时间来计算,另一种根据注册表计算,我使用的是前者。前者方法原理:在一个特定时间段内计算特定进程的总时间和所有进程的总时间,它们的比值就是那个特定进程的确CPU占有率。

  我写了一个函数(改写),以进程的ID作为参数,进程CPU占用率作为返回值,实时计算特定进程的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;

  函数定义:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  

int Button2Click(int id);//参数是进程ID
函数实体:
int Button2Click(int id)
{
int cpuusage;
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 == id)
{
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)
cpuusage = 100 * CurrentDelta / TotalDelta;
//this-Caption = "CPU = " + IntToStr(100 * CurrentDelta / TotalDelta) +
//"Memory = "+ IntToStr(dwWorkingSet / 1024) " K";
LastTotalProcessCPUUsage = TotalProcessCPUUsage;
LastCurrentProcessCPUUsage = CurrentProcessCPUUsage;
delete[] pProcInfo;
return cpuusage;
}

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  控制台调用:

  

int main(void)
{
 while(true)
 {
 int s = Button2Click(0);//在此把进程ID作为参数传入
 printf("%dn",s);
 Sleep(1000);
 }
 return 0;
}

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

  以上代码运行非常正常

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

来源:https://www.tulaoshi.com/n/20160219/1615819.html

延伸阅读
标签: windows 操作系统
  有这么一个现象,当安装windows XP的计算机收到445端口上的连接请求时,windows XP会分配内存并少量地调配CPU资源来为这些连接提供服务.当连接请求负荷过重时,就可能会造成CPU占用率过高,导致系统性能急剧下降,甚至会进入假死状态。 问题原因:   这是由于windows XP工作项目数目和响应能力间“比例失调”造成的...
标签: 办公软件
Word的CPU占用率是比较高的,笔者在Windows XP系统中编辑一篇几十页的Word文档时,“Windows 任务管理器”中的统计信息竟显示Word的CPU占用率高达98%。 实际上,在打开或编辑一篇较长的文档时,Word的CPU占用率便会直线上升,总是占到百分之九十几甚至是百分之百。在如此高的CPU占用率下,同时运行的程序肯定受到很大影响,它会导致其它应...
标签: 电脑入门
一般情况下CPU占了100%的话我们的电脑总会慢下来,而很多时候我们是可以通过做 一点点 的改动就可以解决,而不必问那些大虾了。 当机器慢下来的时候,首先我们想到的当然是任务管理器了,看看到底是哪个程序占了较搞的比例,如果是某个大程序那还可以原谅,在关闭该程序后只要 CPU正常了那就没问题;如果不是,那你就要看看是什幺程序了,当你...
平时使用计算机时经常会遇到速度变慢,一般情况下都是由于cpu占用率过高,那这时应该怎么操作呢?图老师小编在此给出答案,一起来看看吧,希望对大家有帮助! 当机器慢下来的时候,首先我们想到的当然是任务管理器了,看看到底是哪个程序占了较搞的比例,如果是某个大程序那还可以原谅,在关闭该程序后只 要CPU正常了那就没问题;如果不是,...
教你如何通过win7系统自带工具实时查看监测cpu状况   1、在桌面空白处鼠标右击选择小工具选项; 2、然后就会弹出小工具界面,在小工具中可以看到有个CPU仪表盘,然后双击它; 3、双击之后就可以看到cpu仪表小工具被添加到桌面上了,以后我们就可以实时监控cpu状况了,而且又可以起到美观作用哦,很方便吧。 Win7/wi...

经验教程

377

收藏

15
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部