29

C++ で、現在の RAM と CPU の使用率を取得することは可能ですか? プラットフォームに依存しない関数呼び出しはありますか?

4

9 に答える 9

30

残念ながら、これらは基盤となる OS に大きく依存しているため、プラットフォームに依存しない呼び出しはありません。(ラッパーフレームワークがいくつかあるかもしれませんが、私は知りません。)

Linux ではgetrusage()関数呼び出しを確認できます。Windows ではRAM 使用量にGetProcessMemoryInfo()を使用できます。WindowsのProcess Status APIの他の関数も参照してください。

于 2009-01-26T13:17:40.697 に答える
11

多くのプラットフォームでこれら (およびその他のシステム情報) を提供するオープン ソース ライブラリがあります: SIGAR API

かなり大規模なプロジェクトで使用しましたが、正常に動作します (OS X などの特定のコーナー ケースを除く)。

于 2009-01-28T08:40:02.240 に答える
11

私が知っているプラ​​ットフォームに依存しない機能はありません。複数のバージョンの Windows をターゲットにする場合は、バージョンによって実装が異なることに注意してください。たとえば、NT 3.51 でアプリをテストしているときに、この問題に遭遇しました... (古い、私は知っています)。

これは、メモリ側で使用したコードです。これは Windows 以外のプラットフォームでは機能せず、WIN32 定義なしでコンパイルすると 0 が返されます。

編集: 言い忘れましたが、このコードは分割して最も近い MB に丸めます。そのため、どこでも >> 20 になります。

// 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;
}
于 2009-01-26T13:50:57.387 に答える
5

いいえ、ありません。標準ではありません。

この情報が本当に必要な場合は、プラットフォーム固有の #ifdefs を記述するか、それを提供するライブラリにリンクする必要があります。

于 2009-01-26T13:13:17.040 に答える
2

Linux では、これは /proc/self/status を使用します。これを数値化するには、さらに作業が必要です。ただし、メモリ使用量を文字列として画面に直接出力するだけでも、これは便利だと思います。

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();
}
于 2011-06-05T04:59:10.547 に答える
1

これを行うプラットフォームに依存しない方法はありません。Windows の場合でも、コード内で PDH.dll (Performance Data Helper) とその関連 API を使用して、CPU 使用率とパフォーマンス メトリックを取得できます。

詳しい使い方はこちら。

于 2009-01-27T08:55:27.917 に答える
0

それでも問題が解決しない場合は、次を確認してください。

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

Linux (Debian と CentOS でテスト済み) の CPU と RAM の使用状況を取得する方法の例と、インストール方法の非常に簡単な手順を示します。

この小さなプロジェクトについてご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-02-05T10:52:06.347 に答える
0

直接ではありません。

ただし、OS を抽象化するライブラリ (ACE など) を使用できます。
CPUとメモリだけが必要な場合、これは少し重いかもしれません。

于 2009-01-26T16:41:11.690 に答える