⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_39745.htm

📁 一些关于vc的问答
💻 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>&nbsp;&nbsp;DWORD dwUnknown1;<BR>&nbsp;&nbsp;ULONG uKeMaximumIncrement;<BR>&nbsp;&nbsp;ULONG uPageSize;<BR>&nbsp;&nbsp;ULONG uMmNumberOfPhysicalPages;<BR>&nbsp;&nbsp;ULONG uMmLowestPhysicalPage;<BR>&nbsp;&nbsp;ULONG uMmHighestPhysicalPage;<BR>&nbsp;&nbsp;ULONG uAllocationGranularity;<BR>&nbsp;&nbsp;PVOID pLowestUserAddress;<BR>&nbsp;&nbsp;PVOID pMmHighestUserAddress;<BR>&nbsp;&nbsp;ULONG uKeActiveProcessors;<BR>&nbsp;&nbsp;BYTE bKeNumberProcessors;<BR>&nbsp;&nbsp;BYTE bUnknown2;<BR>&nbsp;&nbsp;WORD wUnknown3;<BR>} SYSTEM_BASIC_INFORMATION;<BR><BR>LONG status;<BR>SYSTEM_BASIC_INFORMATION Sbi;<BR><BR>status =&nbsp;&nbsp;NtQuerySystemInformation(SystemBasicInformation,&amp;Sbi,sizeof(Sbi),0);&nbsp;&nbsp;<BR><BR>为了实现多个取样,我们需要在循环中论询CpuTime 和 SystemTime的值并将它们的旧的值存储在临时变量中。有关如何获取系统时间的方法请参见:《Windows NT/2000系统中如何获取系统的启动时间》。CPU的空闲时间存储在SYSTEM_PERFORMANCE_INFORMATION结构的liIdleTime 成员中。<BR><BR>#define SystemPerformanceInformation 2<BR><BR>typedef struct<BR>{<BR>&nbsp;&nbsp;LARGE_INTEGER liIdleTime;<BR>&nbsp;&nbsp;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 =&nbsp;&nbsp;NtQuerySystemInformation(SystemTimeInformation,&amp;Sti,sizeof(Sti),0);&nbsp;&nbsp;<BR>status =&nbsp;&nbsp;NtQuerySystemInformation(SystemPerformanceInformation,&amp;Spi,sizeof(Spi),0);&nbsp;&nbsp;<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 + -