游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1500|回复: 3

系统监视器开发详解2wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2005-4-7 00:16:00 | 显示全部楼层 |阅读模式
  自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,
                   &quoterfStats\\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=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/1.2);
dc.SelectObject(pOldPen);
}

结束语
  系统监视器的核心主要是通过对注册表的操作进行系统的检测,上面的介绍清楚的说明了注册表记录操作系统的各种运行参数,我们要做的就是找到这些参数对应的注册表值,然后根据对这些值的变化来得到当前的系统状态,由于作者时间有限,没有对软件的使用平台进行扩展目前只支持Win9x操作系统,相信经过大家的努力能把它完善!如有任何问题请到作者的VC++资源中心上反应,由于邮件过多无法保证一一回复,另外作者水平有限,请大家多多指正!

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2005-4-7 10:25:00 | 显示全部楼层

Re:系统监视器开发详解2wxh zt

1呢?

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2005-4-7 17:31:00 | 显示全部楼层

给你一个NT和2K下可用的。

//============获取CPU使用率=====================
extern "C"
{
#define SystemProcessorPerformanceInformation 8
        ULONG __stdcall ZwQuerySystemInformation(
                IN ULONG SystemInformationClass,
                IN OUT PVOID SystemInformation,
                IN ULONG SystemInformationLength,
                OUT PULONG ReturnLength OPTIONAL
                );
        typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
                LARGE_INTEGER IdleTime;
                LARGE_INTEGER KernelTime;
                LARGE_INTEGER UserTime;
                LARGE_INTEGER Reserved1[2];
                ULONG Reserved2;
        } SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
}

int Sysinfo::get_cpu_percent()
{
        SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION processorinfo[8];
        memset(processorinfo,0,sizeof(processorinfo));
        ULONG retLen=0;
        ZwQuerySystemInformation(SystemProcessorPerformanceInformation,processorinfo,sizeof(processorinfo),&retLen);
        LONGLONG idletime=processorinfo[0].IdleTime.QuadPart;
        LONGLONG kerneltime=processorinfo[0].KernelTime.QuadPart;
        LONGLONG usertime=processorinfo[0].UserTime.QuadPart;
        SleepEx(1000,TRUE);
        ZwQuerySystemInformation(SystemProcessorPerformanceInformation,processorinfo,sizeof(processorinfo),&retLen);
        idletime=processorinfo[0].IdleTime.QuadPart-idletime;
        kerneltime=processorinfo[0].KernelTime.QuadPart-kerneltime;
        usertime=processorinfo[0].UserTime.QuadPart-usertime;
        int usage=100*(kerneltime+usertime-idletime)/(kerneltime+usertime);
        if(usage<=0)
                usage=1;
        if(usage>100)
                usage=100;
        return usage;
}

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-4-8 17:41:00 | 显示全部楼层

Re:系统监视器开发详解2wxh zt

谢谢楼主分享!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 04:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表