• <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>

            來吧,朋友!

            為C++瘋狂

            C++編程實現計算CPU占用率

            起學習 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;

            // 本文轉自 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;

            // 本文轉自 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 閱讀(1332) 評論(0)  編輯 收藏 引用 所屬分類: C++開發工具

            導航

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

            統計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            收藏夾

            Good blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            精品国产VA久久久久久久冰| 久久久精品国产亚洲成人满18免费网站| 国产欧美久久久精品| 91麻豆国产精品91久久久| 国产精品成人99久久久久91gav| 精品久久久久久中文字幕人妻最新| 无码任你躁久久久久久| 中文字幕无码久久人妻| 亚洲国产精品无码久久青草| 久久精品综合一区二区三区| 亚洲一区二区三区日本久久九| 国产成人精品久久二区二区| 国产亚洲美女精品久久久久狼| 久久99精品综合国产首页| 69国产成人综合久久精品| 九九99精品久久久久久| 国产成人精品久久亚洲| 久久久综合香蕉尹人综合网| 久久久久久久97| 97久久久久人妻精品专区| 色综合久久88色综合天天 | 四虎国产精品免费久久久| 久久99国产精品一区二区| 品成人欧美大片久久国产欧美| 青青热久久国产久精品| 天天躁日日躁狠狠久久| 国产AⅤ精品一区二区三区久久| 久久男人AV资源网站| 伊人久久大香线蕉亚洲五月天| 精品久久久久久无码中文字幕一区| yellow中文字幕久久网| 伊人久久大香线蕉成人| 婷婷综合久久中文字幕蜜桃三电影| 精品久久一区二区| 欧美精品丝袜久久久中文字幕| 久久久免费精品re6| 精品久久综合1区2区3区激情| 狠狠色噜噜色狠狠狠综合久久| 久久综合中文字幕| 天天躁日日躁狠狠久久| 久久久久久青草大香综合精品|