首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

圖形化即時監控 CPU 與記憶體使用率:雙核/單核相容、無閃爍繪製

     編輯:關於VC++

需要在自有程式內嵌即時 CPU/記憶體監控圖表?本文提供兩個獨立 MFC 控件類 CCpuUsgesCtl、CMemUsgesCtl,封裝資料採集、定時器驅動、雙緩衝繪圖,支援動態建立或對話框資源綁定兩種用法,VC6/XP 驗證通過。

核心採集邏輯

CPU 使用率 (跨平台)

  • NT 核心 (NT/2000/XP/後續):呼叫 ntdll.dll 非公開 API NtQuerySystemInformation,讀取 SystemPerformanceInformation 中的 IdleTime 與 SystemTime 差值計算。
    CPU% = 100 - (IdleDelta / SystemDelta) * 100 / ProcessorCount
  • Win9x:讀取登錄檔 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VMM 下的計數器估算。

// NT 核心關鍵片段
typedef LONG (WINAPI *PFN_NtQuerySystemInformation)(UINT, PVOID, ULONG, PULONG);
PFN_NtQuerySystemInformation NtQSI = (PFN_NtQuerySystemInformation)
    GetProcAddress(GetModuleHandle("ntdll"), "NtQuerySystemInformation");
// 取得處理器數、系統時間、閒置時間... 計算百分比
m_fNewUsges = (UINT)cpuPercent;

記憶體使用率

統一呼叫 GlobalMemoryStatus:


MEMORYSTATUS ms = {sizeof(ms)};
GlobalMemoryStatus(&ms);
m_ulNewUsges = ms.dwMemoryLoad; // 0-100 整數百分比

控件架構

  • 繼承 CWnd,內含 CBitmap 雙緩衝,OnTimer 週期採集 + Invalidate 觸發重繪,OnPaint 直接 BitBlt 記憶體位圖 → **零閃爍**。
  • 採集邏輯與繪圖邏輯解耦,易於替換採集來源。

兩種使用方式

方式一:動態建立 (程式碼完全控制)


CCpuUsgesCtl m_cpuCtrl;
CMemUsgesCtl m_memCtrl;

int CMyDlg::OnCreate(LPCREATESTRUCT lpCS) {
    CRect rect(10,10,200,100);
    if (!m_cpuCtrl.Create(WS_CHILD|WS_VISIBLE, rect, this, IDC_CPUCTL)) return -1;
    rect.OffsetRect(0, 110);
    if (!m_memCtrl.Create(WS_CHILD|WS_VISIBLE, rect, this, IDC_MEMCTL)) return -1;
    return 0;
}

方式二:資源編輯器拖放 + 類向導綁定

  1. 對話框放置 Static 控件 (ID: IDC_CPU_STATIC)。
  2. 類向導添加控制型變數 m_cpuCtrl,類型改為 CCpuUsgesCtl。
  3. 同理添加記憶體控件。

運行效果

CPU/記憶體監控圖表

擴展建議

  • 增加網路 I/O、磁碟 I/O 監控控件 (同架構)。
  • 支援歷史數據導出 (CSV)、閾值報警事件。
  • 移植至 WTL/ATL 輕量級框架。

原始碼含兩個控件類完整實作與測試對話框專案,VC6/XP 編譯通過,附件下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved