怎么样取进程占用CPU的百分比哇,就是跟WINDOWS任务管理器“CPU”一栏一样,不太清楚是那个API,我只能到进程时间和信息。

解决方案 »

  1.   

    我這裡有一個控件: TResMeter, 有源代碼的, 可以達到你要求的.我發給你呀.
    或者你自己在網上搜搜.
      

  2.   

    ok,谢谢了,你清楚是取进程CPU资源占用百分比的工作原理不,????
    对了,在还有没登陆WINDOWS系统的时候,自动运行我的程序,就跟pcanywhere一样,没有登陆系统就自动运行?????
      

  3.   

    转贴:取得 CPU 的使用率
    http://www.swissdelphicenter.ch/torry/showcode.php?id=969 How to get the CPU usage in percentconst  SystemBasicInformation = 0;  SystemPerformanceInformation = 2;  SystemTimeInformation = 3;
    type  TPDWord = ^DWORD;
      TSystem_Basic_Information = packed record    dwUnknown1: DWORD;    uKeMaximumIncrement: ULONG;    uPageSize: ULONG;    uMmNumberOfPhysicalPages: ULONG;    uMmLowestPhysicalPage: ULONG;    uMmHighestPhysicalPage: ULONG;    uAllocationGranularity: ULONG;    pLowestUserAddress: Pointer;    pMmHighestUserAddress: Pointer;    uKeActiveProcessors: ULONG;    bKeNumberProcessors: byte;    bUnknown2: byte;    wUnknown3: word;  end;
    type  TSystem_Performance_Information = packed record    liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}    dwSpare: array[0..75] of DWORD;  end;
    type  TSystem_Time_Information = packed record    liKeBootTime: LARGE_INTEGER;    liKeSystemTime: LARGE_INTEGER;    liExpTimeZoneBias: LARGE_INTEGER;    uCurrentTimeZoneId: ULONG;    dwReserved: DWORD;  end;
    var  NtQuerySystemInformation: function(infoClass: DWORD;    buffer: Pointer;    bufSize: DWORD;    returnSize: TPDword): DWORD; stdcall = nil;  liOldIdleTime: LARGE_INTEGER = ();  liOldSystemTime: LARGE_INTEGER = ();
    function Li2Double(x: LARGE_INTEGER): Double;begin  Result := x.HighPart * 4.294967296E9 + x.LowPartend;
    procedure GetCPUUsage;var  SysBaseInfo: TSystem_Basic_Information;  SysPerfInfo: TSystem_Performance_Information;  SysTimeInfo: TSystem_Time_Information;  status: Longint; {long}  dbSystemTime: Double;  dbIdleTime: Double;
      bLoopAborted : boolean;
    begin  if @NtQuerySystemInformation = nil then    NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),      'NtQuerySystemInformation');
      // get number of processors in the system
      status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil);  if status <> 0 then Exit;
      // Show some information  with SysBaseInfo do  begin      ShowMessage(      Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13+      'uMmNumberOfPhysicalPages: %d'+#13+'uMmLowestPhysicalPage: %d'+#13+      'uMmHighestPhysicalPage: %d'+#13+'uAllocationGranularity: %d'#13+      'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d',      [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages,      uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity,      uKeActiveProcessors, bKeNumberProcessors]));  end;  bLoopAborted := False;
      while not bLoopAborted do  begin
        // get new system time    status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0);    if status <> 0 then Exit;
        // get new CPU's idle time    status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil);    if status <> 0 then Exit;
        // if it's a first call - skip it    if (liOldIdleTime.QuadPart <> 0) then    begin
          // CurrentValue = NewValue - OldValue      dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);      dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
          // CurrentCpuIdle = IdleTime / SystemTime      dbIdleTime := dbIdleTime / dbSystemTime;
          // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors      dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5;
          // Show Percentage      Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %',dbIdleTime);
          Application.ProcessMessages;
          // Abort if user pressed ESC or Application is terminated      bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated;
        end;
        // store new CPU's idle and system time    liOldIdleTime := SysPerfInfo.liIdleTime;    liOldSystemTime := SysTimeInfo.liKeSystemTime;
        // wait one second    Sleep(1000);  end;end;procedure TForm1.Button1Click(Sender: TObject);begin  GetCPUUsageend;
      

  4.   

    ok,谢谢了,你清楚是取进程CPU资源占用百分比的工作原理不,????
    对了,在还有没登陆WINDOWS系统的时候,自动运行我的程序,就跟pcanywhere一样,没有登陆系统就自动运行?????你要達到這種效果的呀, 可能要寫成windows的"服務"形式啦.
      

  5.   

    你刚刚给我那个控件,我看了一下,感觉没对安,不是取间个进程的CPU占用情况吗,
    没登陆WINDOWS系统,"服務"形式,有写过吗,能否具体点,忘指点
      

  6.   

    轉:运用Delphi编写Windows NT中服务程序 
    http://www.vbzx.net/ArticleView/vbzx_Article_View_136.asp
      

  7.   

    谢谢哈,刚刚那个控件???是取当个进程CPU占用资源的吗
      

  8.   

    刚刚那个是取单个进程的CPU占用资源???不会吧,我看了代码,感觉没对哦,根本没的传入参数,