📄 subject_39745.htm
字号:
<p>
序号:39745 发表者:parrot 发表日期:2003-05-13 14:03:13
<br>主题:请问如何获得进程当前的CPU负荷?
<br>内容:在系统的任务管理器中,可以看到每个进程的CPU负荷,是百分数形式的,我想在自己的程序中获得这个百分值,不知如何操作?请各位高手指教,谢谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:sunny 回复日期:2003-05-14 09:11:28
<br>内容:目前知道两种方式:<BR>1、2k以后的操作系统可使用 ntdll.dll中的隐式函数<BR>Windows NT/2000中获取CPU使用率的方法与Windows 9x系统中所使用的方法不同,Windows NT/2000中获取CPU使用率不用"性能计数器"。而是使用一个NTDLL.DLL中未公开的API函数--NtQuerySystemInformation。它的使用方法参见另外一篇文章:《Windows NT/2000系统中如何获取系统的启动时间》。<BR><BR>为了计算Windows NT/2000系统中CPU的使用率,我们使用下面的公式:<BR><BR>CpuUsageInPercent = 100 - (CpuTimen - CpuTimen-1 - CpuTime0) / (SystemTimen - SystemTimen-1 - SystemTime0) / NumberOfProcessors * 100<BR><BR>这里<BR>CpuTime为CPU的空闲时间(毫秒);<BR>SystemTime为系统时间(毫秒);<BR>NumberOfProcessors为系统中处理器的数量;<BR>0,1,n 表示取样数(0指最老的取样,1 指最近的取样,n 指最新的取样);<BR><BR>下面我们来求出调用NtQuerySystemInformation函数所必需的参数值。首先求出处理器数量值,SYSTEM_BASIC_INFORMATION结构中有一个bKeNumberProcessors成员,它就是我们所需要的。<BR><BR>#define SystemBasicInformation 0<BR><BR>typedef struct<BR>{<BR> DWORD dwUnknown1;<BR> ULONG uKeMaximumIncrement;<BR> ULONG uPageSize;<BR> ULONG uMmNumberOfPhysicalPages;<BR> ULONG uMmLowestPhysicalPage;<BR> ULONG uMmHighestPhysicalPage;<BR> ULONG uAllocationGranularity;<BR> PVOID pLowestUserAddress;<BR> PVOID pMmHighestUserAddress;<BR> ULONG uKeActiveProcessors;<BR> BYTE bKeNumberProcessors;<BR> BYTE bUnknown2;<BR> WORD wUnknown3;<BR>} SYSTEM_BASIC_INFORMATION;<BR><BR>LONG status;<BR>SYSTEM_BASIC_INFORMATION Sbi;<BR><BR>status = NtQuerySystemInformation(SystemBasicInformation,&Sbi,sizeof(Sbi),0); <BR><BR>为了实现多个取样,我们需要在循环中论询CpuTime 和 SystemTime的值并将它们的旧的值存储在临时变量中。有关如何获取系统时间的方法请参见:《Windows NT/2000系统中如何获取系统的启动时间》。CPU的空闲时间存储在SYSTEM_PERFORMANCE_INFORMATION结构的liIdleTime 成员中。<BR><BR>#define SystemPerformanceInformation 2<BR><BR>typedef struct<BR>{<BR> LARGE_INTEGER liIdleTime;<BR> DWORD dwSpare[76];<BR>} SYSTEM_PERFORMANCE_INFORMATION;<BR><BR>LARGE_INTEGER liOldIdleTime = {0,0};<BR>LARGE_INTEGER liOldSystemTime = {0,0};<BR>SYSTEM_PERFORMANCE_INFORMATION Spi;<BR><BR>while (1) {<BR>status = NtQuerySystemInformation(SystemTimeInformation,&Sti,sizeof(Sti),0); <BR>status = NtQuerySystemInformation(SystemPerformanceInformation,&Spi,sizeof(Spi),0); <BR><BR>// calculate the CPU usage here<BR><BR>liOldIdleTime = Spi.liIdleTime;<BR>liOldSystemTime = Sti.liKeSystemTime;<BR><BR>Sleep(1000);<BR>}<BR>2、使用winsdk 中关于performance的函数(推荐---支持任何win系统(win3x不清楚)),如需要发个工程给你看看
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:parrot 回复日期:2003-05-14 09:43:53
<br>内容:十分感谢兄台这么详细的介绍,我倾向与使用方法2的实现,但是不知SDK中我应该使用哪个函数?如方便劳烦告知,再次感谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:sunny 回复日期:2003-05-14 15:41:07
<br>内容:在msdn中察看,cphd class,该类是由一个非常专业的测试组织成员开发,也被引用为windows下 performance的计量方法,很cool.至于细节研究一下msdn,也可去参考一下,www.codeguru.com中perforamnce的示例,不过比较简单,算作抛砖引玉只用吧!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:parrot 回复日期:2003-05-15 08:38:44
<br>内容:兄台说的类我怎么找不到呀?你说的是什么MSDN?我现在用的是VC6自带的MSDN,里面索引和检索都找不到你说的cphd class,请详细说明一下如何?感谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:sunny 回复日期:2003-05-16 16:31:38
<br>内容:msdn july 2000(version)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -