MFC下獲取系統內存和當前進程的內存使用情況


GlobalMemoryStatusEx來獲取系統的內存使用情況

GetProcessMemoryInfo獲取某個進程的內存使用情況。和任務管理器看到的是一樣的。

具體代碼如下:

void GetSystemMemoryInfo()
{
    CString strInfo;
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    GlobalMemoryStatusEx(&statex);

    DWORDLONG physical_memory = statex.ullTotalPhys / (1024 * 1024);
    DWORDLONG avalid_memory = statex.ullAvailPhys / (1024 * 1024);
    DWORDLONG virtual_totalmemory = statex.ullTotalVirtual / (1024 * 1024);
    DWORDLONG virtual_memory = statex.ullAvailVirtual / (1024 * 1024);
    DWORDLONG usePhys = physical_memory - avalid_memory;
    DWORDLONG useVirtual = virtual_totalmemory - virtual_memory;

    float percent_memory = ((float)usePhys / (float)physical_memory) * 100;
    float percent_memory_virtual = ((float)useVirtual / (float)virtual_totalmemory) * 100;
    strInfo.Format("物理內存使用率:%.2f%% 物理內存:%lld MB 可用物理內存:%lld MB\n", percent_memory, physical_memory, avalid_memory);
    showText(strInfo);
    strInfo.Format("虛擬內存使用率:%.2f%% 虛擬內存:%lld MB 可用虛擬內存:%lld MB \n", percent_memory_virtual, virtual_totalmemory, virtual_memory);
    showText(strInfo);

    SYSTEM_INFO si;
    GetSystemInfo(&si);

    DWORD pid = GetCurrentProcessId();
    HANDLE handle;
    handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    PROCESS_MEMORY_COUNTERS pmc;
    GetProcessMemoryInfo(handle, &pmc, sizeof(pmc));

    int usedMemory = 0;

    PSAPI_WORKING_SET_INFORMATION workSet;
    memset(&workSet, 0, sizeof(workSet));
    BOOL bOk = QueryWorkingSet(handle, &workSet, sizeof(workSet));
    if (bOk || (!bOk && GetLastError() == ERROR_BAD_LENGTH))
    {
        int nSize = sizeof(workSet.NumberOfEntries) + workSet.NumberOfEntries*sizeof(workSet.WorkingSetInfo);
        char* pBuf = new char[nSize];
        if (pBuf)
        {
            QueryWorkingSet(handle, pBuf, nSize);
            PSAPI_WORKING_SET_BLOCK* pFirst = (PSAPI_WORKING_SET_BLOCK*)(pBuf + sizeof(workSet.NumberOfEntries));
            DWORD dwMem = 0;
            for (ULONG_PTR nMemEntryCnt = 0; nMemEntryCnt < workSet.NumberOfEntries; nMemEntryCnt++, pFirst++)
            {
                if (pFirst->Shared == 0)
                {
                    dwMem += si.dwPageSize;
                }
            }
            delete pBuf;
            pBuf = NULL;
            if (workSet.NumberOfEntries > 0)
            {
                usedMemory = dwMem / (1024 * 1024);
            }
        }
    }
    strInfo.Format("進程id:%d 已使用內存 %d MB\n", pid, usedMemory);

    showText(strInfo);

    CloseHandle(handle);
}

 需要引入頭文件#include <psapi.h>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM