TAG:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=1095181 前段时间,在做一套系统,系统的数据采集部分对系统cpu占有率有要求,在cpu占有率到达100%时,USB传输数据就会出现问题,因此最好能够实时监视CPU的占有率,占有高的时候暂停采集,等到恢复到低占有率时恢复采集,这样系统就比较问题。本来想自己写一个这样的功能,在百度上一搜,结果有前辈分享了(搜索是个好东东啊,提高工作效率哦)。我现在在这里再转载一下(前辈不要见怪,我是换了好多关键字才搜到你的哦),以便有同样需要的朋友,能方便搜到,呵呵。 #include <windows.h> #include <conio.h> #include <stdio.h> #define SystemBasicInformation 0 #define SystemPerformanceInformation 2 #define SystemTimeInformation 3 #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart)) typedef struct{ DWORD dwUnknown1; ULONG uKeMaximumIncrement; ULONG uPageSize; ULONG uMmNumberOfPhysicalPages; ULONG uMmLowestPhysicalPage; ULONG uMmHighestPhysicalPage; ULONG uAllocationGranularity; PVOID pLowestUserAddress; PVOID pMmHighestUserAddress; ULONG uKeActiveProcessors; BYTE bKeNumberProcessors; BYTE bUnknown2; WORD wUnknown3; } SYSTEM_BASIC_INFORMATION; typedef struct{ LARGE_INTEGER liIdleTime; DWORD dwSpare[76]; } SYSTEM_PERFORMANCE_INFORMATION; typedef struct{ LARGE_INTEGER liKeBootTime; LARGE_INTEGER liKeSystemTime; LARGE_INTEGER liExpTimeZoneBias; ULONG uCurrentTimeZoneId; DWORD dwReserved; } SYSTEM_TIME_INFORMATION; typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG); PROCNTQSI NtQuerySystemInformation; void main() { SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo; SYSTEM_TIME_INFORMATION SysTimeInfo; SYSTEM_BASIC_INFORMATION SysBaseInfo; double dbIdleTime; double dbSystemTime; LONG status; LARGE_INTEGER liOldIdleTime = {0,0}; LARGE_INTEGER liOldSystemTime = {0,0}; NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation"); if (!NtQuerySystemInformation) return; // get number of processors in the system status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL); if (status != NO_ERROR) return; int amount=0; //printf("\\n您的CPU使用率为: "); while(!_kbhit()) { //设置新的系统时间: amount++; status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0); if (status!=NO_ERROR) return; status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL); if (status != NO_ERROR) return; if (liOldIdleTime.QuadPart != 0) { dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); dbIdleTime = dbIdleTime / dbSystemTime; dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors; int c=(int)dbIdleTime; printf("\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b%d---%d%%",amount,c); } //改变新的CPU使用率和系统时间 liOldIdleTime = SysPerfInfo.liIdleTime; liOldSystemTime = SysTimeInfo.liKeSystemTime; Sleep(1000); } printf("\\n"); } (iwgh) |