zoukankan      html  css  js  c++  java
  • 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
    ", percent_memory, physical_memory, avalid_memory);
        showText(strInfo);
        strInfo.Format("虚拟内存使用率:%.2f%% 虚拟内存:%lld MB 可用虚拟内存:%lld MB 
    ", 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
    ", pid, usedMemory);
    
        showText(strInfo);
    
        CloseHandle(handle);
    }

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

    高山流水,海纳百川!
  • 相关阅读:
    【STM32 .Net MF开发板学习02】GPIO测试
    【STM32 .Net MF开发板学习01】Hello world
    【STM32 .Net MF开发板学习04】TinyGUI位图显示
    【STM32 .Net MF开发板学习03】TinyGUI绘图示例
    【STM32 .Net MF开发板学习06】蜂鸣器和LED数码管显示
    免费发放firmwave,打造史上最低价.Net MF开发板
    Windows Media Center携手新浪、搜狐推出互联网视频
    【STM32 .Net MF开发板学习07】全屏位图无闪烁显示
    第二部分 Mongodb增删改查 简单
    第二部分 Mongodb固定集合与性能 简单
  • 原文地址:https://www.cnblogs.com/ahcc08/p/11330779.html
Copyright © 2011-2022 走看看