如何在delphi中编程得到cpu的占用比率!?

解决方案 »

  1.   

    在C++Builder论坛里,有一个 Win 2000/XP 下的代码,你自己看一下:
    http://expert.csdn.net/Expert/TopicView1.asp?id=1671459
      

  2.   

    http://www.swissdelphicenter.ch/torry/showcode.php?id=969
     How to get the CPU usage in percent
    const 
      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.LowPart 
    end; 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 
      GetCPUUsage 
    end;