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

来源:互联网 发布:2017淘宝店铺复核认证 编辑:程序博客网 时间:2024/04/28 06:49

最近在做一个网管软件用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 1typedef 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%的时候,就得考虑切换码流,保证视频播放的流畅性。

阅读全文
0 0
原创粉丝点击