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

匿名 (未验证) 提交于 2019-12-03 08:33:39

问题:

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

回答1:

There is an open source library that gives these (and more system info stuff) across many platforms: SIGAR API

I've used it in fairly large projects and it works fine (except for certain corner cases on OS X etc.)



回答2:

Sadly these things rely heavily on the underlying OS, so there are no platform-independent calls. (Maybe there are some wrapper frameworks, but I don't know of any.)

On Linux you could have a look at the getrusage() function call, on Windows you can use GetProcessMemoryInfo() for RAM Usage. Have also a look at the other functions in the Process Status API of Windows.



回答3:

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);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!