• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            來(lái)吧,朋友!

            為C++瘋狂

            C++編程實(shí)現(xiàn)計(jì)算CPU占用率

            起學(xué)習(xí) NT/2000方法:

            #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;


            // ntdll!NtQuerySystemInformation (NT specific!)
            //
            // The function copies the system information of the
            // specified type into a buffer
            //
            // NTSYSAPI
            // NTSTATUS
            // NTAPI
            // NtQuerySystemInformation(
            // IN UINT SystemInformationClass, // information type
            // OUT PVOID SystemInformation, // pointer to buffer
            // IN ULONG SystemInformationLength, // buffer size in bytes
            // OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit
            // // variable that receives
            // // the number of bytes
            // // written to the buffer
            // );
            typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

            PROCNTQSI NtQuerySystemInformation;


            void main(void)
            {
            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;

            printf("\nCPU Usage (press any key to exit): ");
            while(!_kbhit())
            {
            // get new system time
            status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
            if (status!=NO_ERROR)
            return;

            // get new CPU's idle time
            status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
            if (status != NO_ERROR)
            return;

            // 本文轉(zhuǎn)自 C Builder研究 - http://www.ccrun.com/article.asp?i=424&d=7jw23a
            // if it's a first call - skip it
            if (liOldIdleTime.QuadPart != 0)
            {
            // CurrentValue = NewValue - OldValue
            dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
            dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

            // CurrentCpuIdle = IdleTime / SystemTime
            dbIdleTime = dbIdleTime / dbSystemTime;

            // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
            dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors 0.5;

            printf("\b\b\b\b=%%",(UINT)dbIdleTime);
            }

            // store new CPU's idle and system time
            liOldIdleTime = SysPerfInfo.liIdleTime;
            liOldSystemTime = SysTimeInfo.liKeSystemTime;

            // wait one second
            Sleep(1000);
            }
            printf("\n");
            }

            //-------------------------------------------------------------

            W9X:
            #include <windows.h>
            #include <conio.h>
            #include <stdio.h>

            void main(void)
            {
            HKEY hkey;
            DWORD dwDataSize;
            DWORD dwType;
            DWORD dwCpuUsage;

            // starting the counter
            if ( RegOpenKeyEx( HKEY_DYN_DATA,
            "PerfStats\\StartStat",
            0,KEY_ALL_ACCESS,
            &hkey ) != ERROR_SUCCESS)
            return;

            dwDataSize=sizeof(DWORD);
            RegQueryValueEx( hkey,
            "KERNEL\\CPUUsage",
            NULL,&dwType,
            (LPBYTE)&dwCpuUsage,
            &dwDataSize );

            RegCloseKey(hkey);

            // geting current counter's value
            if ( RegOpenKeyEx( HKEY_DYN_DATA,
            "PerfStats\\StatData",
            0,KEY_READ,
            &hkey ) != ERROR_SUCCESS)
            return;

            printf("\nCPU Usage (press any key to exit): ");
            while(!_kbhit())
            {
            dwDataSize=sizeof(DWORD);
            RegQueryValueEx( hkey,
            "KERNEL\\CPUUsage",
            NULL,&dwType,
            (LPBYTE)&dwCpuUsage,
            &dwDataSize );
            Sleep(500);
            printf("\b\b\b\b=%%",dwCpuUsage);
            }
            printf("\n");

            RegCloseKey(hkey);

            // stoping the counter
            if ( RegOpenKeyEx( HKEY_DYN_DATA,
            "PerfStats\\StopStat",
            0,KEY_ALL_ACCESS,
            &hkey ) != ERROR_SUCCESS)
            return;

            dwDataSize=sizeof(DWORD);
            RegQueryValueEx( hkey,
            "KERNEL\\CPUUsage",
            NULL,&dwType,
            (LPBYTE)&dwCpuUsage,
            &dwDataSize );

            RegCloseKey(hkey);
            } NT/2000方法:

            #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;


            // ntdll!NtQuerySystemInformation (NT specific!)
            //
            // The function copies the system information of the
            // specified type into a buffer
            //
            // NTSYSAPI
            // NTSTATUS
            // NTAPI
            // NtQuerySystemInformation(
            // IN UINT SystemInformationClass, // information type
            // OUT PVOID SystemInformation, // pointer to buffer
            // IN ULONG SystemInformationLength, // buffer size in bytes
            // OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit
            // // variable that receives
            // // the number of bytes
            // // written to the buffer
            // );
            typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

            PROCNTQSI NtQuerySystemInformation;


            void main(void)
            {
            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;

            printf("\nCPU Usage (press any key to exit): ");
            while(!_kbhit())
            {
            // get new system time
            status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
            if (status!=NO_ERROR)
            return;

            // get new CPU's idle time
            status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
            if (status != NO_ERROR)
            return;

            // 本文轉(zhuǎn)自 C Builder研究 - http://www.ccrun.com/article.asp?i=424&d=7jw23a
            // if it's a first call - skip it
            if (liOldIdleTime.QuadPart != 0)
            {
            // CurrentValue = NewValue - OldValue
            dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
            dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

            // CurrentCpuIdle = IdleTime / SystemTime
            dbIdleTime = dbIdleTime / dbSystemTime;

            // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
            dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors 0.5;

            printf("\b\b\b\b=%%",(UINT)dbIdleTime);
            }

            // store new CPU's idle and system time
            liOldIdleTime = SysPerfInfo.liIdleTime;
            liOldSystemTime = SysTimeInfo.liKeSystemTime;

            // wait one second
            Sleep(1000);
            }
            printf("\n");
            }

            //-------------------------------------------------------------

            W9X:
            #include <windows.h>
            #include <conio.h>
            #include <stdio.h>

            void main(void)
            {
            HKEY hkey;
            DWORD dwDataSize;
            DWORD dwType;
            DWORD dwCpuUsage;

            // starting the counter
            if ( RegOpenKeyEx( HKEY_DYN_DATA,
            "PerfStats\\StartStat",
            0,KEY_ALL_ACCESS,
            &hkey ) != ERROR_SUCCESS)
            return;

            dwDataSize=sizeof(DWORD);
            RegQueryValueEx( hkey,
            "KERNEL\\CPUUsage",
            NULL,&dwType,
            (LPBYTE)&dwCpuUsage,
            &dwDataSize );

            RegCloseKey(hkey);

            // geting current counter's value
            if ( RegOpenKeyEx( HKEY_DYN_DATA,
            "PerfStats\\StatData",
            0,KEY_READ,
            &hkey ) != ERROR_SUCCESS)
            return;

            printf("\nCPU Usage (press any key to exit): ");
            while(!_kbhit())
            {
            dwDataSize=sizeof(DWORD);
            RegQueryValueEx( hkey,
            "KERNEL\\CPUUsage",
            NULL,&dwType,
            (LPBYTE)&dwCpuUsage,
            &dwDataSize );
            Sleep(500);
            printf("\b\b\b\b=%%",dwCpuUsage);
            }
            printf("\n");

            RegCloseKey(hkey);

            // stoping the counter
            if ( RegOpenKeyEx( HKEY_DYN_DATA,
            "PerfStats\\StopStat",
            0,KEY_ALL_ACCESS,
            &hkey ) != ERROR_SUCCESS)
            return;

            dwDataSize=sizeof(DWORD);
            RegQueryValueEx( hkey,
            "KERNEL\\CPUUsage",
            NULL,&dwType,
            (LPBYTE)&dwCpuUsage,
            &dwDataSize );

            RegCloseKey(hkey);
            }

            posted on 2009-07-22 18:11 yanghaibao 閱讀(1341) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++開(kāi)發(fā)工具

            導(dǎo)航

            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類(lèi)

            隨筆檔案

            文章檔案

            收藏夾

            Good blogs

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久免费精品国产| 久久免费线看线看| 无码精品久久久天天影视| 久久亚洲精品国产精品| 99久久精品国产一区二区蜜芽| 欧美性猛交xxxx免费看久久久| 久久久久久久女国产乱让韩| 亚洲国产精品久久| 国内精品久久久久影院薰衣草| 成人精品一区二区久久| 亚洲中文字幕无码久久2017| 久久精品亚洲男人的天堂| 蜜臀av性久久久久蜜臀aⅴ| 久久午夜福利电影| 青青热久久综合网伊人| 久久久久久亚洲Av无码精品专口| 久久久久久无码国产精品中文字幕 | 777久久精品一区二区三区无码| 尹人香蕉久久99天天拍| 国产成人精品久久| 久久国产乱子精品免费女| 伊人久久大香线焦AV综合影院 | 国产毛片欧美毛片久久久| 精品久久久久久久中文字幕 | 久久综合狠狠综合久久综合88| 久久久久人妻一区精品| 久久精品国产久精国产| 国产成人无码久久久精品一| 亚洲中文字幕无码久久2020 | 亚洲欧美久久久久9999| 久久人人超碰精品CAOPOREN | 久久久久久国产精品免费免费| 久久被窝电影亚洲爽爽爽| 狠狠色丁香久久综合五月| 国产精品久久网| 久久精品国产福利国产秒| 91精品国产91久久久久久青草| 久久―日本道色综合久久| 91久久成人免费| 精品国产综合区久久久久久| 久久国产免费直播|