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

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产综合久久天堂| 99久久精品国产一区二区三区| 伊人久久精品线影院| 久久精品亚洲精品国产欧美| 久久综合狠狠综合久久97色| 欧美日韩精品久久久免费观看| 久久人妻少妇嫩草AV无码专区| 狠狠色丁香婷综合久久| 亚洲欧美日韩久久精品| 丁香五月网久久综合| 国产精品久久久久a影院| 99精品国产在热久久无毒不卡| 久久精品国产欧美日韩| 九九久久自然熟的香蕉图片| 久久久久99精品成人片| 久久大香香蕉国产| 午夜精品久久久久久影视777| 久久久久久人妻无码| 日韩人妻无码一区二区三区久久99| 久久精品一本到99热免费| 女同久久| 久久久久国产亚洲AV麻豆| 国产91色综合久久免费分享| 亚洲精品NV久久久久久久久久| 国产精品久久亚洲不卡动漫| 久久久久久无码Av成人影院| 亚洲级αV无码毛片久久精品| 久久久久亚洲AV无码专区桃色| 26uuu久久五月天| 99久久精品毛片免费播放| 亚洲国产欧美国产综合久久| 国产精品一区二区久久精品涩爱 | 久久91亚洲人成电影网站| 一本一本久久a久久精品综合麻豆| 93精91精品国产综合久久香蕉| 久久免费视频观看| 久久免费小视频| 国产精品女同一区二区久久| 国产综合精品久久亚洲| 久久97久久97精品免视看秋霞| 国产成人久久久精品二区三区|