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

后端 未结 9 964
后悔当初
后悔当初 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 06:50

    Not directly.

    But you can use a library that abstracts the OS (such as ACE).
    Though this might by a bit heavy if you just want CPU and Memory.

    0 讨论(0)
  • 2020-12-01 06:53

    There is no platform independent way to do this. Although for windows, you can get the CPU usage and performance metrics by using PDH.dll(Performance Data Helper) and its related APIs in your code.

    Here's more on how to use it.

    0 讨论(0)
  • 2020-12-01 06:56

    No, there isn't, not in the standard.

    If you truly need this information, you will have to write platform-specific #ifdefs or link against a library that provides it.

    0 讨论(0)
  • 2020-12-01 07:00

    On Linux, this will use /proc/self/status . More work is required to turn this into a number. I find this useful as it is though, just to print the memory usage directly to the screen as a string.

    static string memory_usage() {
            ostringstream mem;
            PP("hi");
            ifstream proc("/proc/self/status");
            string s;
            while(getline(proc, s), !proc.fail()) {
                    if(s.substr(0, 6) == "VmSize") {
                            mem << s;
                            return mem.str();
                    }
            }
            return mem.str();
    }
    
    0 讨论(0)
  • 2020-12-01 07:01

    If that is still the case please check:

    http://sourceforge.net/projects/cpp-cpu-monitor/

    It gives you an example how to get CPU and RAM usage of a Linux (tested on Debian and CentOS) and a quite simple instruction of how to install.

    Please feel free to ask if you have any questions regarding this small project.

    0 讨论(0)
  • 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;
    }
    
    0 讨论(0)
提交回复
热议问题