web-dev-qa-db-fra.com

Comment obtenir le processeur actuel et RAM utilisation en C++?

est-il possible, en C++, d’obtenir la RAM actuelle et l’utilisation de la CPU? Existe-t-il un appel de fonction indépendant de la plate-forme? 

29
tunnuz

Il existe une bibliothèque open source qui donne ces informations (et davantage d'informations système) sur de nombreuses plateformes: API SIGAR

Je l'ai utilisé dans des projets assez volumineux et cela fonctionne bien (à l'exception de certains cas d'angle sur OS X, etc.)

11
ididak

Malheureusement, ces éléments dépendent fortement du système d'exploitation sous-jacent. Il n'y a donc pas d'appels indépendants de la plate-forme. (Peut-être y a-t-il des frameworks de wrapper, mais je n'en connais aucun.)

Sous Linux, vous pouvez consulter l'appel getrusage () function, sous Windows, vous pouvez utiliser GetProcessMemoryInfo () for RAM Usage. Consultez également les autres fonctions de la API Process Status de Windows.

30
Kosi2801

À ma connaissance, il n’existe pas de fonction indépendante de la plate-forme. SI vous prévoyez de cibler plusieurs versions de Windows, sachez que la mise en œuvre diffère d’une version à l’autre. J'ai rencontré ce problème lors du test d'une application sous NT 3.51 par exemple ... (archaïque, je sais).

Voici un code que j'ai utilisé pour le côté mémoire des choses. Cela ne fonctionne pas sur d'autres plates-formes que Windows et renvoie simplement 0 lorsqu'il est compilé sans le WIN32, définissez:

EDIT: J'ai oublié de mentionner, ce code divise et arrondit au MB le plus proche, d'où le >> 20 partout.

// 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;
}
11
jheriko

Non, il n'y en a pas, pas dans la norme.

Si vous avez vraiment besoin de ces informations, vous devrez écrire #ifdefs spécifique à la plate-forme ou établir un lien avec une bibliothèque qui les fournit.

5
HUAGHAGUAH

Sous Linux, cela utilisera/proc/self/status. Plus de travail est nécessaire pour transformer cela en un nombre. Je trouve cela utile en l'état, juste pour imprimer l'utilisation de la mémoire directement à l'écran sous forme de chaîne.

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();
}
2
Aaron McDaid

Il n'y a pas de moyen indépendant de la plate-forme pour faire cela. Bien que pour Windows, vous pouvez obtenir les mesures d'utilisation du processeur et de performance en utilisant PDH.dll (Performance Data Helper) et ses API associées dans votre code.

Voici plus sur la façon de l'utiliser.

1
Samrat Patil

Si tel est toujours le cas, veuillez vérifier:

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

Il vous donne un exemple sur la façon d'obtenir le processeur et l'utilisation RAM d'un système Linux (testé sur Debian et CentOS), ainsi que des instructions simples pour l'installation.

N'hésitez pas à demander si vous avez des questions concernant ce petit projet.

0
Bartosz Pachołek

Pas directement.

Mais vous pouvez utiliser une bibliothèque qui résume le système d'exploitation (telle que ACE).
Bien que cela puisse paraître un peu lourd si vous voulez juste du processeur et de la mémoire.

0
Martin York