首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 发一个获取CPU使用率的函数,顺便问个问题 [已结帖,结帖人:kkkgho]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kkkgho
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-18 16:02:12 楼主



    本文的目的是为了和大家讨论一个问题,同时给出一个根据进程ID,来返回该进程实时占用的CPU使用率的函数。希望大家在用这个函数的时候别忘记我的问题。

          目前计算进程CPU占用率的方法主要有两种,一种是根据时间来计算,另一种根据注册表计算,我使用的是前者。前者方法原理:在一个特定时间段内计算特定进程的总时间和所有进程的总时间,它们的比值就是那个特定进程的确CPU占有率。

          我写了一个函数(改写),以进程的ID作为参数,进程CPU占用率作为返回值,实时计算特定进程的CPU占用,测试正确。整个程序如下:

    结构定义:
    typedef struct _THREAD_INFO
    {
    LARGE_INTEGER CreateTime;
    DWORD dwUnknown1;
    DWORD dwStartAddress;
    DWORD StartEIP;
    DWORD dwOwnerPID;
    DWORD dwThreadId;
    DWORD dwCurrentPriority;
    DWORD dwBasePriority;
    DWORD dwContextSwitches;
    DWORD Unknown;
    DWORD WaitReason;

    }THREADINFO, *PTHREADINFO;

    typedef struct _UNICODE_STRING
    {
    USHORT Length;
    USHORT MaxLength;
    PWSTR Buffer;
    } UNICODE_STRING;

    typedef struct _PROCESS_INFO
    {
    DWORD dwOffset;
    DWORD dwThreadsCount;
    DWORD dwUnused1[6];
    LARGE_INTEGER CreateTime;
    LARGE_INTEGER UserTime;
    LARGE_INTEGER KernelTime;
    UNICODE_STRING ProcessName;

    DWORD dwBasePriority;
    DWORD dwProcessID;
    DWORD dwParentProcessId;
    DWORD dwHandleCount;
    DWORD dwUnused3[2];

    DWORD dwVirtualBytesPeak;
    DWORD dwVirtualBytes;
    ULONG dwPageFaults;
    DWORD dwWorkingSetPeak;
    DWORD dwWorkingSet;
    DWORD dwQuotaPeakPagedPoolUsage;
    DWORD dwQuotaPagedPoolUsage;
    DWORD dwQuotaPeakNonPagedPoolUsage;
    DWORD dwQuotaNonPagedPoolUsage;
    DWORD dwPageFileUsage;
    DWORD dwPageFileUsagePeak;

    DWORD dCommitCharge;
    THREADINFO ThreadSysInfo[1];

    } PROCESSINFO, *PPROCESSINFO;

    函数定义:

    int Button2Click(int id);//参数是进程ID

    函数实体:
    int Button2Click(int id)
    {
    int cpuusage;
    PVOID pProcInfo = NULL;
    DWORD dwInfoSize = 0x20000;
    PPROCESSINFO pProcessInfo;
    DWORD dwWorkingSet;
    long ( __stdcall *NtQuerySystemInformation )( DWORD, PVOID, DWORD, DWORD );


    static __int64 LastTotalProcessCPUUsage = 0;
    static __int64 LastCurrentProcessCPUUsage = 0;

    int CurrentDelta;
    int TotalDelta;

    __int64 TotalProcessCPUUsage = 0;
    __int64 CurrentProcessCPUUsage = 0;

    /////////////////////////////////

    pProcInfo = (PVOID)(new byte[dwInfoSize]);

    NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD))
    GetProcAddress( GetModuleHandle( "ntdll.dll" ),"NtQuerySystemInformation" );

    NtQuerySystemInformation(5,pProcInfo,dwInfoSize,0);

    pProcessInfo = (PPROCESSINFO)pProcInfo;

    do
    {
    TotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;

    if(pProcessInfo->dwProcessID == id)
    {
    dwWorkingSet = pProcessInfo->dwWorkingSet;
    CurrentProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
    }

    /////////
    if(pProcessInfo->dwOffset == 0)
    {
    break;
    }

    pProcessInfo = (PPROCESSINFO)((byte*)pProcessInfo + pProcessInfo->dwOffset);
    }
    while(true);

    TotalDelta = TotalProcessCPUUsage - LastTotalProcessCPUUsage;
    CurrentDelta = CurrentProcessCPUUsage - LastCurrentProcessCPUUsage;

    if(TotalDelta != 0)
    cpuusage = 100 * CurrentDelta / TotalDelta;

    //this->Caption = "CPU = " + IntToStr(100 * CurrentDelta / TotalDelta) +
    //"Memory = "+ IntToStr(dwWorkingSet / 1024) " K";

    LastTotalProcessCPUUsage = TotalProcessCPUUsage;
    LastCurrentProcessCPUUsage = CurrentProcessCPUUsage;

    delete[] pProcInfo;
    return cpuusage;

    }


    控制台调用:
    int main(void)
    {
    while(true)
    {
      int s = Button2Click(0);//在此把进程ID作为参数传入
      printf("%d/n",s);
      Sleep(1000);
    }
    return 0;
    }
    ///////////////////////////////
    以上代码运行非常正常
    ///////////////////////////////


    但我如何实时求出系统中运行的每个进程的CPU占用率,并列表显示出来??

    我遍历系统进程(for循环),然后把每个进程的ID作为参数传入,外部用定时器控制,

    但是我得到的值都是错的,为什么???


    谁能搞定这个问题??

    问题:用此函数实时计算系统所有进程的CPU使用率,并在列表中显示出来??谢谢了,本人急用!!!
    40  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kkkgho
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:12:401楼 得分:0
    UP
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zonghenglls
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:25:412楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zjw6861982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:26:463楼 得分:0
    不错的东东,顶DIY
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kkkgho
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:47:064楼 得分:0
    但是没人回答我的问题……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ljx665
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 20:18:405楼 得分:0
    我是新手,我是来学习的  :(
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • FallingStar08
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 21:24:456楼 得分:0
    很好,很强大
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kkkgho
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 09:42:077楼 得分:0
    :(

    都把东西拿跑了就走
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • stone_clock
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 15:45:278楼 得分:40
    你在Button2Click中传的参数为0,你传出来的就是0进程的CPU利用率了,何不传一个队列进去,让它把数据带出来呢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kkkgho
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 15:46:159楼 得分:0
    我试过,和FOR一样,获取的数据都不准确,大家可以试试看的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • flamingsky007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 15:52:0010楼 得分:0
    路过。。。学习了再走!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nwpulei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 15:54:4311楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Who_know_me
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:13:4112楼 得分:0
    路过,看看~
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved