How to get current CPU and RAM usage in C++?

后端 未结 9 967
后悔当初
后悔当初 2020-12-01 06:44

is it possible, in C++, to get the current RAM and CPU usage? Is there a platform-indepentent function call?

9条回答
  •  独厮守ぢ
    2020-12-01 07:03

    There is not a platform independent function for this that I know of. IF you plan to target multiple versions of Windows be aware that the implementation differs across some versions. I hit this problem when testing an app under NT 3.51 for instance... (archaic, I know).

    Here is some code I used for the memory side of things. This doesn't work across platforms other than windows, and will just return 0 when compiled without the WIN32 define:

    EDIT: I forgot to mention, this code divides and rounds down to the nearest MB, hence the >> 20 all over the place.

    // get memory info...
    int getTotalRAM()
    {
        int ret = 0;
    #ifdef WIN32
        DWORD v = GetVersion();
        DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
        DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
        DWORD build;
        if (v < 0x80000000) build = (DWORD)(HIWORD(v));
        else build = 0;
    
        // because compiler static links the function...
        BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
    
        HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
        GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
    
        if(GMSEx)
        {
            MEMORYSTATUSEX m;
            m.dwLength = sizeof(m);
            if(GMSEx(&m))
            {
                ret = (int)(m.ullTotalPhys>>20);
            }
        }
        else
        {
            MEMORYSTATUS m;
            m.dwLength = sizeof(m);
            GlobalMemoryStatus(&m);
            ret = (int)(m.dwTotalPhys>>20);
        }
    #endif
        return ret;
    }
    
    int getAvailRAM()
    {
        int ret = 0;
    #ifdef WIN32
        DWORD v = GetVersion();
        DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
        DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
        DWORD build;
        if (v < 0x80000000) build = (DWORD)(HIWORD(v));
        else build = 0;
    
        // because compiler static links the function...
        BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
    
        HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
        GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
    
        if(GMSEx)
        {
            MEMORYSTATUSEX m;
            m.dwLength = sizeof(m);
            if(GMSEx(&m))
            {
                ret = (int)(m.ullAvailPhys>>20);
            }
        }
        else
        {
            MEMORYSTATUS m;
            m.dwLength = sizeof(m);
            GlobalMemoryStatus(&m);
            ret = (int)(m.dwAvailPhys>>20);
        }
    #endif
        return ret;
    }
    
    int getTotalMemory()
    {
        int ret = 0;
    #ifdef WIN32
        DWORD v = GetVersion();
        DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
        DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
        DWORD build;
        if (v < 0x80000000) build = (DWORD)(HIWORD(v));
        else build = 0;
    
        // because compiler static links the function...
        BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
    
        HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
        GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
    
        if(GMSEx)
        {
            MEMORYSTATUSEX m;
            m.dwLength = sizeof(m);
            if(GMSEx(&m))
            {
                ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20);
            }
        }
        else
        {
            MEMORYSTATUS m;
            m.dwLength = sizeof(m);
            GlobalMemoryStatus(&m);
            ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20);
        }
    #endif
        return ret;
    }
    
    int getAvailMemory()
    {
        int ret = 0;
    #ifdef WIN32
        DWORD v = GetVersion();
        DWORD major =  (DWORD)(LOBYTE(LOWORD(v)));
        DWORD minor =  (DWORD)(HIBYTE(LOWORD(v)));
        DWORD build;
        if (v < 0x80000000) build = (DWORD)(HIWORD(v));
        else build = 0;
    
        // because compiler static links the function...
        BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
    
        HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
        GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
    
        if(GMSEx)
        {
            MEMORYSTATUSEX m;
            m.dwLength = sizeof(m);
            if(GMSEx(&m))
            {
                ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20);
            }
        }
        else
        {
            MEMORYSTATUS m;
            m.dwLength = sizeof(m);
            GlobalMemoryStatus(&m);
            ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20);
        }
    #endif
        return ret;
    }
    

提交回复
热议问题