任务管理器可以看到进程的cpu占用率, 进程的用户名, 进程的内存使用 等信息.我想知道这个是用什么实现的. 而且任务管理器占用资源极少, 我用phd函数也能取得进程的信息, 但是非常耗费资源, 想知道windows的任务管理器是怎么取得进程的各种信息的.特别是进程的cpu占用率, 如果用phd函数来一次性取各进程的cpu占用率, 一般cpu都是被自己的进程全部占满, 自己进程的cpu占用率100, 其他进程的cpu占用率都是0, 不能达到监控系统进程状态的目的. 如果不用phd函数实现, 用EnumProcess, 快照等方法, 又不能得到各进程的cpu利用率.

解决方案 »

  1.   

    通过查看 taskmgr 的 kernel32 导入表,主要有如下函数:
    ExitProcess
    GetCurrentProcess
    GetCurrentProcessId
    GetCurrentThreadId
    GetPriorityClass
    GetProcAddress
    GetProcessHeap
    GetStartupInfoW
    GetThreadTimes
    OpenProcess
    SetPriorityClass
    SetProcessShutdownParameters
    TerminateProcess
    我注意到其中一个函数 GetThreadTimes ,我想这也许是一个值得下手的地方,通过枚举进程的线程信息来并根据线程占用CPU的时间和来进行计算,虽然不完全准确,但应该值得研究
      

  2.   

    还有一个GetProcessTimes的函数, 不过GetProcessTimes和GetThreadTimes这两个函数是都是计算进程生命中的进程/线程 在用户态和核心态分别总共耗费了多少CPU时间, 不是CPU占用%, 最好能有个函数获得cpu占用率的, 就像pdh函数一样, 不过pdh函数太慢.
    不过还是谢谢你, 你教会了我分析别人程序的方法^_^
      

  3.   

    rCodeProject上有个封装好的类,看是否好用
      

  4.   

    To oyljerry: 那个类叫什么名字来着, 信息不够, 很难搜索啊, 谢谢^_^
      

  5.   

    phd中提供一次性读取CPU使用率的函数么?!phd是微软提供给performance monitor的一套借口。所有的情报都可以通过性能监视器(perfmon)来获得,我怎么没有看到进程所占CPU使用率这一项呢?!正常的方法应该是取两个时间点,然后算出这一段时间该进程所占时间的百分比。
      

  6.   

    请问怎么看 taskmgr 的 kernel32 导入表,偶菜,高手讲解一下,谢谢
      

  7.   

    To gonch(gongch): 请你查看MSDN中的Browsing Performance Counters例子, 里面可以找到phd支持的所有字符串, \\Process(idle)\\% Processor Time 可以读到idle进程的cpu%, 具体是不是这个字符串我忘了, 你可以用那个例子查查看.To dawning371: 有很多辅助工具可以查看到dll导出函数, 不过只能看到静态导出的, 如果通过GetProcAddress应该看不到的.由于我已经下载了win2000源码, 得到了TaskMgr win2000下实现的全部细节, 不过xp下还需改动, 因为api调用有变化. 谢谢各位捧场. 还是源码好^_^
      

  8.   

    对, 可以看 windows 的源码
      

  9.   

    谢谢 skymartin,又长了一点见识