程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 《系統飛狐》系列軟件中的“系統監視器”開發詳解

《系統飛狐》系列軟件中的“系統監視器”開發詳解

編輯:關於VC++

自2001年開發系統飛狐系列軟件以來,系統飛狐軟件只進行過三次升級,現在由於要做畢業設計,更加沒有時間來對整個軟件,現把整個系統中一個軟件——“系統監視器”的源代碼拿出來共享,懇請大家指正,希望大家一起把它做得更好.該系統目前支持只支持Window9x,開發平台為VC++6.0,軟件界面如圖一所示,熟悉windows操作系統的朋友們都知道注冊表在windows操作系統中核心地位,系統的許多設置和操作都保存在注冊表中,比如添加刪除功能、系統的所有設置(桌面、圖標、系統文件夾,系統自動運行程序等等)都可以在注冊表中找到相應的值,修改這些東西都會對操作系統產生重大的影響,詳情可以參照系統飛狐軟件。

系統監視器能監視系統采用實時的曲線記錄當前操作系統的CPU使用率、核心線程個數、磁盤的高速緩存、內存的大小及使用情況,通過實時的曲線變化反應當前系統的運行特征,這在當前的系統優化設置軟件中並不多見!

圖一. 軟件界面

軟件主要是根據注冊表中"HKEY_DYN_DATA, PerfStats"下面的值的實時的變化獲得當前系統的各種特征值,通過VC++定時器對采集這些數據處理後得到當前的變化值。系統的各種主要的參數相對應在注冊表中的值如下面的代碼所示,不一一詳細解說。以CPU使用率和線程的個數的監視原理作為例子跟大家解說一下基本原理,這裡用到了比較多的Wins32 API函數.

DWORD dwDataSize;
DWORD dwType;
// starting the counter
if ( RegOpenKeyEx( HKEY_DYN_DATA,
          "PerfStats\\StartStat",
          0,
          KEY_ALL_ACCESS,
          &hkey ) != ERROR_SUCCESS
         )
return FALSE;
//CPU使用率的獲得
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
         "KERNEL\\CPUUsage",
         NULL,&dwType,
         (LPBYTE)&dwCpuUsage,
         &dwDataSize );
RegCloseKey(hkey);
//線程個數的獲得
RegQueryValueEx( hkey,
         "KERNEL\\Threads",
         NULL,
         &dwType,
         (LPBYTE)&dwThreadUsage,
         &dwDataSize );
RegCloseKey(hkey);
// geting current counter''s value
if ( RegOpenKeyEx( HKEY_DYN_DATA, "PerfStats\\StatData", 0,KEY_READ, &hkey ) != ERROR_SUCCESS)
return FALSE;
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
        "KERNEL\\CPUUsage",
        NULL,
        &dwType,
        (LPBYTE)&dwCpuUsage,
        &dwDataSize );//CPU的獲得

RegQueryValueEx( hkey,
         "KERNEL\\Threads",
         NULL,&dwType,
         (LPBYTE)&dwThreadUsage,
         &dwDataSize );
//線程的獲得 SetTimer(1,500,NULL); //定時器

繪制實時曲線描述當前狀態,在OnTimer函數和OnPaint中編制如下代碼來求得實時的值然後繪制曲線:

void CCpuPage::OnTimer(UINT nIDEvent)
{
  DWORD dwDataSize;
  DWORD dwType;
  dwDataSize=sizeof(DWORD);
  RegQueryValueEx( hkey,
           "KERNEL\\CPUUsage",
           NULL,
           &dwType,
           (LPBYTE)&dwCpuUsage,
           &dwDataSize ); //CPU 的獲得

  RegQueryValueEx( hkey,
          "KERNEL\\Threads",
          NULL,
          &dwType,
          (LPBYTE)&dwThreadUsage,
          &dwDataSize );//線程的獲得

  UpdateData(FALSE);
  Invalidate(FALSE);
  CPropertyPage::OnTimer(nIDEvent);
}
void CCpuPage::OnPaint()
{ CPaintDC dc(this); // device context for painting
for( i=0; i<50;i++)//畫歷史圖
{
  m_CPUData[i]=m_CPUData[i+1];//歷史值
}
m_CPUData[49]=n*3;
dc.MoveTo(146,94-m_CPUData[0]);繪制曲線
for( i=1; i<50;i++)
{
  dc.LineTo(146+4.7*i,94-m_CPUData[i]/1.2);
  dc.SelectObject(pOldPen);
}

圖二 圖形界面

結束語

系統監視器的核心主要是通過對注冊表的操作進行系統的檢測,上面的介紹清楚的說明了注冊表記錄操作系統的各種運行參數,我們要做的就是找到這些參數對應的注冊表值,然後根據對這些值的變化來得到當前的系統狀態,由於作者時間有限,沒有對軟件的使用平台進行擴展目前只支持Win9x操作系統,相信經過大家的努力能把它完善!如有任何問題請到作者的VC++資源中心上反應,由於郵件過多無法保證一一回復,另外作者水平有限,請大家多多指正!

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved