Windows下用C语言获取系统的CPU利用率、内存使用率、硬盘使用率等

最近在做一个网管软件用C语言获取的系统的一些参数,其中包括系统时间,系统运行时间,系统版本,CPU利用率,内存使用率,硬盘使用率,CPU风扇转速等参数,整理代码如下:`

#include <stdio.h>
#include <Windows.h>
#include<time.h>
#include <tchar.h>

#define DIV 1024
#define WIDTH 7
#define GB(x) (((x).HighPart << 2) + ((DWORD)(x).LowPart) / 1024.0 / 1024.0 / 1024.0)

#pragma warning(disable: 4996)   

#define true 1
typedef unsigned char U_CHAR;

//获取系统时间
int getSystemTime(char* buffer){

    char buf[128];
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    strftime(buf, sizeof(buf), "Now is %Y-%m-%d %H:%M:%S", timeinfo);
    strcpy(buffer,buf);
}

//CPU利用率
FILETIME m_preidleTime;
FILETIME m_prekernelTime;
FILETIME m_preuserTime;

__int64 CompareFileTime2(FILETIME time1, FILETIME time2)
{
    __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
    __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;


    return   b - a;
}

void GetCpuUseage()
{
    GetSystemTimes(&m_preidleTime, &m_prekernelTime, &m_preuserTime);
    Sleep(1000);
}

double CpuUseage()
{
    FILETIME idleTime;
    FILETIME kernelTime;
    FILETIME userTime;
    GetSystemTimes(&idleTime, &kernelTime, &userTime);


    int idle = CompareFileTime2(m_preidleTime, idleTime);
    int kernel = CompareFileTime2(m_prekernelTime, kernelTime);
    int user = CompareFileTime2(m_preuserTime, userTime);


    if (kernel + user == 0)
        return 0.0;
    //(总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率
    double cpu = abs((kernel + user - idle) * 100 / (kernel + user));

    m_preidleTime = idleTime;
    m_prekernelTime = kernelTime;
    m_preuserTime = userTime;
    return cpu;
}
//读取操作系统的名称
void GetSystemName(char* osname)
{
    char buf[128];
    SYSTEM_INFO info;        //用SYSTEM_INFO结构判断64位AMD处理器 
    GetSystemInfo(&info);    //调用GetSystemInfo函数填充结构 
    OSVERSIONINFOEX os;
    os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

    strcpy(buf, "unknown OperatingSystem.");

    if (GetVersionEx((OSVERSIONINFO *)&os))
    {
        //下面根据版本信息判断操作系统名称 
        switch (os.dwMajorVersion)//判断主版本号
        {
        case 4:
            switch (os.dwMinorVersion)//判断次版本号 
            {
            case 0:
                if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
                    strcpy(buf, "Microsoft Windows NT 4.0"); //1996年7月发布 
                else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
                    strcpy(buf, "Microsoft Windows 95");
                break;
            case 10:
                strcpy(buf, "Microsoft Windows 98"); 
                break;
            case 90:
                strcpy(buf, "Microsoft Windows Me"); 
                break;
            }
            break;

        case 5:
            switch (os.dwMinorVersion)  //再比较dwMinorVersion的值
            {
            case 0:
                strcpy(buf, "Microsoft Windows 2000"); //1999年12月发布
                break;

            case 1:
                strcpy(buf, "Microsoft Windows XP"); //2001年8月发布
                break;

            case 2:
                if (os.wProductType == VER_NT_WORKSTATION
                    && info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
                {
                    strcpy(buf, "Microsoft Windows XP Professional x64 Edition"); 
                }
                else if (GetSystemMetrics(SM_SERVERR2) == 0)
                    strcpy(buf, "Microsoft Windows Server 2003"); //2003年3月发布 
                else if (GetSystemMetrics(SM_SERVERR2) != 0)
                    strcpy(buf, "Microsoft Windows Server 2003 R2"); 
                break;
            }
            break;

        case 6:
            switch (os.dwMinorVersion)
            {
            case 0:
                if (os.wProductType == VER_NT_WORKSTATION)
                    strcpy(buf, "Microsoft Windows Vista"); 
                else
                    strcpy(buf, "Microsoft Windows Server 2008"); //服务器版本 
                break;
            case 1:
                if (os.wProductType == VER_NT_WORKSTATION)
                    strcpy(buf, "Microsoft Windows 7"); 
                else
                    strcpy(buf, "Microsoft Windows Server 2008 R2"); 
                break;
            }
            break;
        }
    }//if(GetVersionEx((OSVERSIONINFO *)&os))

    strcpy(osname, buf);
}

int main(){

    //获取系统时间
    char buffer[128];
    getSystemTime(buffer);
    puts(buffer);

    //系统运行时间
    clock_t start, finish;
    double duration;

    start = clock();
    while (true)
    {
        finish = clock();
        duration = (double)(finish - start) / CLOCKS_PER_SEC;
        Sleep(1000);
        printf("%.0f 秒\n", duration);

    }

    //系统版本名称
    char osname[20];
    GetSystemName(osname);
    printf("%s\n", osname);

    //CPU利用率
    while (true)
    {
        U_CHAR  sysStateCpu[5];
        double cpu = CpuUseage();
        sprintf((char*)sysStateCpu, "%.2lf", cpu);
        printf("CPU使用率:%s%%\n", sysStateCpu);
        Sleep(1000);
    }

    //内存使用率
    char bufPreCPU[5];
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    GlobalMemoryStatusEx(&statex);
    sprintf(bufPreCPU, "%ld%%\n", statex.dwMemoryLoad);
    puts(bufPreCPU);

    //硬盘使用率 调用windows API
    ULARGE_INTEGER FreeBytesAvailableC, TotalNumberOfBytesC, TotalNumberOfFreeBytesC;
    ULARGE_INTEGER FreeBytesAvailableD, TotalNumberOfBytesD, TotalNumberOfFreeBytesD;
    ULARGE_INTEGER FreeBytesAvailableE, TotalNumberOfBytesE, TotalNumberOfFreeBytesE;
    ULARGE_INTEGER FreeBytesAvailableF, TotalNumberOfBytesF, TotalNumberOfFreeBytesF;

    GetDiskFreeSpaceEx(_T("C:"), &FreeBytesAvailableC, &TotalNumberOfBytesC, &TotalNumberOfFreeBytesC);
    GetDiskFreeSpaceEx(_T("D:"), &FreeBytesAvailableD, &TotalNumberOfBytesD, &TotalNumberOfFreeBytesD);
    GetDiskFreeSpaceEx(_T("E:"), &FreeBytesAvailableE, &TotalNumberOfBytesE, &TotalNumberOfFreeBytesE);
    GetDiskFreeSpaceEx(_T("F:"), &FreeBytesAvailableF, &TotalNumberOfBytesF, &TotalNumberOfFreeBytesF);
    /*参数 类型及说明
    lpRootPathName String,不包括卷名的磁盘根路径名
    lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
    lpTotalNumberOfBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数
    lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数
    适用平台
    Windows 95 OSR2,Windows NT 4.0*/
    float totalHardDisk = GB(TotalNumberOfBytesC) + GB(TotalNumberOfBytesD) + GB(TotalNumberOfBytesE) + GB(TotalNumberOfBytesF);
    float freeHardDisk = GB(TotalNumberOfFreeBytesC) + GB(TotalNumberOfFreeBytesD) + GB(TotalNumberOfFreeBytesE) + GB(TotalNumberOfFreeBytesF);

    float hardDiskUsage = 1- freeHardDisk / totalHardDisk;

    //CPU风扇转速

    printf("hello world!\n");
    system("pause");

}

在播放视频的情况下,默认采用的是主码流播放,当打开多窗口的情况下,会出现电脑卡顿的情形。这时候需要保证客户端播放视频流畅,可以考虑适当的降低码流,所以将主码流切换到辅码流。检测CPU以及内存使用情况显得有必要性了,因此采用上面的方法,获取系统的运行状况,特别是CPU使用率,一般情况下,当CPU使用率超过80%的时候,就得考虑切换码流,保证视频播放的流畅性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值