现在的位置: 首页 > 综合 > 正文

CPU占用率

2012年12月05日 ⁄ 综合 ⁄ 共 6560字 ⁄ 字号 评论关闭
下面是头文件
/************************************************************************/
/* 
* 作者:cpp
* 日期:2008-09-05
* 内容:提供了一个CSystemInformation类,该类可以获取CPU厂家,
*                CPU频率,CPU个数,当前使用的CPU,系统运行时占用的
*                CPU比率,系统运行的Idle时间,User时间以及Kernel时间
*                获取某个进程的句柄个数,获取随机数(比编译器自带更灵活),
*                以及将长整数(long long )转换为浮点数,宽字节与窄字节之间的互换
*
* 注意:有几个函数仅可以用在windows xp系统上,在其他系统上将失效或不起作用
*                因此,调用时需要注意,另外,如果转入到其他编译器_WIN32_WINNT用来
*                指示需要windows xp系统
*/

/************************************************************************/

#pragma once

#include
<sstream>
#include 
<cassert>

#ifndef _WINBASE_
#include 
<WinBase.h>
#endif // _WINBASE_H

//#define  _WIN32_WINNT // 该值已经在stdafx.h中被声明过,只能够用在winxp系统上

typedef 
struct _SYSTEM_BASIC_INFORMATION {
    BYTE Reserved1[
24];
    PVOID Reserved2[
4];
    CCHAR NumberOfProcessors;
}
 SYSTEM_BASIC_INFORMATION;  // 结构等同于SYSTEM_INFO

typedef 
struct
{
    
long long             IdleTime;
    DWORD           dwReversed[
76];
}
 SYSTEM_PERFORMANCE_INFORMATION;

typedef 
struct _SYSTEM_PROCESS_INFORMATION {
    ULONG NextEntryOffset;
    BYTE Reserved1[
52];
    PVOID Reserved2[
3];
    HANDLE UniqueProcessId;
    PVOID Reserved3;
    ULONG HandleCount;
    BYTE Reserved4[
4];
    PVOID Reserved5[
11];
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER Reserved6[
6];
}
 SYSTEM_PROCESS_INFORMATION;

typedef 
struct
{
    LARGE_INTEGER liKeBootTime;
    LARGE_INTEGER liKeSystemTime;
    LARGE_INTEGER liExpTimeZoneBias;
    ULONG         uCurrentTimeZoneId;
    DWORD         dwReserved;
}
 SYSTEM_TIME_INFORMATION;  // 等同于GetSystemTimes获取到的三个数据

class CSystemInformation
{
public:
// 定义基础数据类型
    typedef std::basic_string<TCHAR> string;
    typedef std::basic_stringstream
<TCHAR> stringstream;
    typedef std::basic_string
<BYTE>  byteString;

public:
    
enum SYSTEM_INFORMATION
    
{
        SystemBasicInformation 
= 0,
        SystemPerformanceInformation 
= 2,
        SystemTimeInformation  
= 3,
    }
;
protected:
    typedef DWORD (WINAPI
* NTQUERYSYSTEMINFOMATION) (         
        SYSTEM_INFORMATION SystemInformationClass,
        PVOID SystemInformation,
        ULONG SystemInformationLength,
        PULONG ReturnLength );

public:
    CSystemInformation(
void);
public:
    
~CSystemInformation(void);
public:
    
// 获取基础信息系统,并返回处理
    const LPSYSTEM_INFO GetSystemInfo(void);

protected:
    
// 处理错误消息
    void ProcessErrorMessage(TCHAR* ErrorText);
public:
    
// 产生给定长度的随机数,由windows系统产生,比C编译器产生的更加随机
    byteString GenRandom(int len);

public:
    
// 返回转换后的wchar_t指针,并返回长度
    wchar_t* ToChar(const char* str, int* len);
public:
    
// 返回转换后的char指针,并返回长度
    char* ToChar(const wchar_t* str, int* len);
public:
    
// 获取本地机器的CPU硬件信息
    string GetCPUCompany(void);
public:
    
// 获取CPU个数
    int GetCPUNumbers(void);
public:
    
// 获取当前CPU编号-即当前使用的是哪个CPU
    int GetCurrentCPU(void);
public:
    
// 获取某个打开进程的句柄个数
    long GetProcessHandleCount(HANDLE hProcess);
public:
    
// 获取系统空闲时间
    LPFILETIME GetIdleTime(void);

public:
    
// 获取系统核心运行时间
    LPFILETIME GetKernelTime(void);
    
// 获取用户运行时间
    LPFILETIME GetUserTime(void);
public:
    
// 获取系统(空闲,核心以及用户)运行时间
    void GetSystemTimes(LPFILETIME IdleTime, LPFILETIME KernelTime, LPFILETIME UserTime,  bool ImmediateRet=false);
public:
    
// 获取CPU占用率
    double GetCPURate(void);
public:
    
// 将64位的长整数转换为64位的实数
    double LongInt2Double(LARGE_INTEGER want);
public:
    
double LongInt2Double(long long want)
    
{
        LARGE_INTEGER _want;
        memcpy( 
&_want, &want, sizeof(LARGE_INTEGER) );
        
return LongInt2Double(  _want );
    }

    
double LongInt2Double(FILETIME want)
    
{        
        LARGE_INTEGER _want;
        memcpy( 
&_want, &want, sizeof(LARGE_INTEGER) );
        
return LongInt2Double( _want);
    }

public:
    
// 获取CPU的频率,高字节部分为主频,低字节部分为次频,以GHz为单位
    int GetCPUFrenquence(void);
public:
    
// 获取当前使用的CPU编号
    int GetCurrentUseCPU(void);

public:
    
// 获取注册表所能够达到的最大尺寸,以字节为单位
    long GetMaxRegisterSize(void);
public:
    
// 获取当前注册表的尺寸,以字节为单位
    long GetCurrRegisterSize(void);

private:
    
long long  m_IdleTime;
    
long long m_KernelTime;
    
long long  m_UserTime;
    
// 用来表示是否已经获取了系统的信息,true为已经获取,false为没有获取
    bool m_bHasSystemInfo;
    wchar_t    
*m_pWChar;
    
char    *m_pchar;
private:
    
// 系统信息
    SYSTEM_INFO m_system_info;
private:
    
// NTDLL.DLL 句柄
    HMODULE m_hNtDll;
    
// NtQuerySystemInformation 函数地址
    NTQUERYSYSTEMINFOMATION NtQuerySystemInformation; 
}
;

下面是实现文件:
 

/************************************************************************/
/* 
* 作者:cpp
* 日期:2008-09-05
* 内容:提供了一个CSystemInformation类,该类可以获取CPU厂家,
*                CPU频率,CPU个数,当前使用的CPU,系统运行时占用的
*                CPU比率,系统运行的Idle时间,User时间以及Kernel时间
*                获取某个进程的句柄个数,获取随机数(比编译器自带更灵活),
*                将长整数(long long )转换为浮点数,宽字节与窄字节之间的互换
*                注册表最大容量,当前注册表容量
*/

/************************************************************************/

//#include "stdafx.h"
#include <windows.h>
#include 
"SystemInformation.h"
#include 
<WinCrypt.h>
#include 
<winbase.h>

CSystemInformation::CSystemInformation()
: m_bHasSystemInfo(
false)
{
    m_pWChar 
= NULL;
    m_pchar 
= NULL;
    m_hNtDll 
= NULL;

    m_bHasSystemInfo 
= false;

    ::memset( 
&m_system_info, 0sizeof(m_system_info));

    m_hNtDll 
= ::LoadLibrary(TEXT("ntdll.dll"));
    
if( NULL == m_hNtDll)
    
{
        
this->ProcessErrorMessage(TEXT("没有载入ntdll.dll文件!"));
        
return ;
    }

    
this->NtQuerySystemInformation = (NTQUERYSYSTEMINFOMATION) GetProcAddress(
            m_hNtDll, 
"NtQuerySystemInformation"
        );
    
if( NULL== NtQuerySystemInformation )
    
{
        
this->ProcessErrorMessage(TEXT("没有找到NtQuerySystemInformation地址!"));
        
return ;
    }

    
}


CSystemInformation::
~CSystemInformation()
{
    
if( NULL != m_pWChar)
    
{
        delete []m_pWChar;
        m_pWChar 
= NULL;
    }


    
if( NULL != m_pchar )
    
{
        delete []m_pchar;
        m_pchar 
= NULL;
    }

    
    
if( NULL != m_hNtDll )
    
{
        FreeLibrary(m_hNtDll);
        m_hNtDll 
= NULL;
    }


}


void CSystemInformation::ProcessErrorMessage( TCHAR* ErrorText )
{
    LPVOID lpMsgBuf;

    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER 
| FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
// Default language
        (LPTSTR) &lpMsgBuf,
        
0,
        NULL 
        );
    stringstream ss;
    ss 
<< TEXT("警告:"<< ErrorText << TEXT("存在下面的错误:\n")
        
<< lpMsgBuf << std::endl;
    MessageBox(NULL, ss.str().c_str(), TEXT(
"程序错误"), MB_ICONSTOP);
    LocalFree(lpMsgBuf);
}


const LPSYSTEM_INFO CSystemInformation::GetSystemInfo( void )
{
    ::GetSystemInfo( 
&m_system_info );
    m_bHasSystemInfo 
= true;
    
return &m_system_info;

抱歉!评论已关闭.