Question

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

Était-ce utile?

La solution

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

Je l'ai utilisé dans des projets assez volumineux et cela fonctionne bien (sauf dans certains cas avec Mac OS X, etc.)

Autres conseils

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 existe-t-il des frameworks de wrapper, mais je n'en connais aucun.)

Sous Linux, vous pouvez consulter l'appel de fonction getrusage () , le Windows, vous pouvez utiliser GetProcessMemoryInfo () pour l'utilisation de la RAM. Consultez également les autres fonctions de l’ API Process Status <. / a> de Windows.

À 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. Je rencontre 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. Cela ne fonctionne pas sur d'autres plates-formes que Windows et renvoie simplement 0 lorsqu'il est compilé sans la définition WIN32:

EDIT: J'ai oublié de mentionner, ce code se divise et se arrondit au Mo 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;
}

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 créer un lien vers une bibliothèque qui les fournit.

Sous Linux, cela utilisera / proc / self / status. Plus de travail est nécessaire pour transformer cela en un nombre. Je trouve cela utile dans l'état actuel des choses, 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();
}

Pas directement.

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

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'utiliser le processeur et la mémoire vive d'un système Linux (testé sous Debian et CentOS), ainsi qu'une instruction assez simple sur la procédure d'installation.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top