it-swarm.com.de

So erhalten Sie die aktuelle CPU und RAM Verwendung in C++?

ist es in C++ möglich, die aktuelle RAM und CPU-Auslastung abzurufen? Gibt es einen plattformunabhängigen Funktionsaufruf? 

29
tunnuz

Es gibt eine Open-Source-Bibliothek, die diese (und weitere Systeminformationen) auf vielen Plattformen zur Verfügung stellt: SIGAR API

Ich habe es in ziemlich großen Projekten verwendet und es funktioniert gut (außer bei bestimmten Eckfällen unter OS X usw.).

11
ididak

Leider hängen diese Dinge stark vom zugrunde liegenden Betriebssystem ab, so dass es keine plattformunabhängigen Aufrufe gibt. (Vielleicht gibt es einige Wrapper-Frameworks, aber ich kenne keine.)

Unter Linux können Sie sich den Funktionsaufruf getrusage () ansehen. Unter Windows können Sie GetProcessMemoryInfo () für RAM verwenden. Schauen Sie sich auch die anderen Funktionen in der Process Status API von Windows an.

30
Kosi2801

Dafür gibt es keine plattformunabhängige Funktion, die ich kenne. WENN Sie beabsichtigen, mehrere Windows-Versionen als Ziel festzulegen, beachten Sie, dass sich die Implementierung bei einigen Versionen unterscheidet. Ich bin auf dieses Problem gestoßen, als ich zum Beispiel eine App unter NT 3.51 getestet habe ... (archaisch, ich weiß).

Hier ist ein Code, den ich für die Gedächtnisseite verwendet habe. Dies funktioniert nicht auf anderen Plattformen als Windows und gibt nur 0 zurück, wenn es ohne die Definition von WIN32 kompiliert wird:

EDIT: Ich habe vergessen zu erwähnen, dieser Code teilt und rundet auf den nächsten MB ab, daher der >> 20 überall.

// 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

Nein, das gibt es nicht, nicht im Standard.

Wenn Sie diese Informationen wirklich benötigen, müssen Sie plattformspezifische #ifdefs oder eine Verknüpfung mit einer Bibliothek erstellen, die diese Informationen bereitstellt.

5
HUAGHAGUAH

Unter Linux wird dies mit/proc/self/status verwendet. Mehr Arbeit ist nötig, um daraus eine Zahl zu machen. Ich finde das zwar nützlich, nur um die Speichernutzung direkt als Zeichenfolge auf dem Bildschirm zu drucken.

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

Es gibt keinen plattformunabhängigen Weg, dies zu tun. Für Windows können Sie zwar die CPU-Auslastung und die Leistungsdaten ermitteln, indem Sie PDH.dll (Performance Data Helper) und die zugehörigen APIs in Ihrem Code verwenden.

Hier erfahren Sie mehr, wie man es benutzt.

1
Samrat Patil

Wenn dies immer noch der Fall ist, überprüfen Sie bitte:

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

Sie erhalten ein Beispiel für die Verwendung von Linux (getestet unter Debian und CentOS) für CPU und RAM sowie eine recht einfache Installationsanweisung.

Bei Fragen zu diesem kleinen Projekt können Sie sich gerne an uns wenden.

0

Nicht direkt.

Sie können jedoch eine Bibliothek verwenden, die das Betriebssystem abstrahiert (beispielsweise ACE).
Dies kann jedoch etwas schwer werden, wenn Sie nur CPU und Speicher benötigen.

0
Martin York