请问哪位有获得CPU的利率的源码。在线等待。

解决方案 »

  1.   

    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; 
      

  2.   

    获取当前的系统的CPU占用的百分率:
    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;
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils,
      Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        Label1 : TLabel;
        procedure Label1Click(Sender: TObject);
        procedure Label1DblClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1 : TForm1;
      stop  : boolean;implementation{$R *.DFM}function GetCPUSpeed : Double;
    const
      DelayTime = 500; // measure time in ms
    var
      TimerHi, TimerLo : DWORD;
      PriorityClass, Priority : Integer;
    begin
      PriorityClass := GetPriorityClass(GetCurrentProcess);
      Priority := GetThreadPriority(GetCurrentThread);  SetPriorityClass(GetCurrentProcess,
                         REALTIME_PRIORITY_CLASS);
      SetThreadPriority(GetCurrentThread,
                         THREAD_PRIORITY_TIME_CRITICAL);  Sleep(10);
      asm
        dw 310Fh // rdtsc
        mov TimerLo, eax
        mov TimerHi, edx
      end;
      Sleep(DelayTime);
      asm
        dw 310Fh // rdtsc
        sub eax, TimerLo
        sbb edx, TimerHi
        mov TimerLo, eax
        mov TimerHi, edx
      end;  SetThreadPriority(GetCurrentThread, Priority);
      SetPriorityClass(GetCurrentProcess, PriorityClass);  Result := TimerLo / (1000.0 * DelayTime);
    end;
    procedure TForm1.Label1Click(Sender: TObject);
    begin
    Stop := False;
      while not Stop do
      begin
        label1.Caption := Format('CPU speed: %f MHz',
                                           [GetCPUSpeed]);
        Application.ProcessMessages;
      end;
    end;
    procedure TForm1.Label1DblClick(Sender: TObject);
    begin
      Stop := True;
    end;end.
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, CommCtrl, StdCtrls, Menus,WinSpool, ExtCtrls, Validat, Buttons,
      Registry;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Timer1: TTimer;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Private-Deklarationen }
        started : boolean;
        reg : TRegistry;
      public
        { Public-Deklarationen }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
      var
      Dummy : array[0..1024] of byte;begin
      Reg:=TRegistry.Create;
      Reg.RootKey:=HKEY_DYN_DATA;     //统计数据在这个表项下
      Reg.OpenKey('PerfStats\StartStat',false);       //   Reg.ReadBinaryData('KERNEL\CPUUsage',Dummy,Sizeof(Dummy));
      Reg.CloseKey;
      started:=true;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
      var
      CPUU : integer;begin
      if started then
      begin
        Reg.OpenKey('PerfStats\StatData',false);       
        Reg.ReadBinaryData('KERNEL\CPUUsage',CPUU,SizeOf(Integer));
        Reg.CloseKey;
        Label1.Caption:=IntToStr(CPUU)+'%';
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
      var
      Dummy : array[0..1024] of byte;begin
    'PerfStats/StopStat' }
      Reg.OpenKey('PerfStats\StopStat',false);      
      Reg.ReadBinaryData('KERNEL\CPUUsage',Dummy,SizeOf(Dummy));
      Reg.Free;
      Started:=false;
    end;end.
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    const
      delay=500;
    var
      cpuinfo:system_info;
      priorityclass:integer;
      priority:integer;
      timerlo:DWord;
      timerHi:DWord;
    begin
      getsysteminfo(cpuinfo);
      edit1.Text:=inttostr(cpuinfo.wProcessorArchitecture);
      edit2.Text:=inttostr(cpuinfo.dwProcessorType);
      priorityclass:=getpriorityclass(getcurrentprocess);
      priority:=getthreadpriority(getcurrentthread);
      setpriorityclass(getcurrentprocess,realtime_priority_class);
      setthreadpriority(getcurrentthread,thread_priority_time_critical);
      sleep(10);
      asm
      dw 310Fh
      mov timerlo,eax
      mov timerhi,edx
      end;
      sleep(delay);
      asm
      dw 310Fh
      sub eax,timerlo
      sbb edx,timerhi
      mov timerlo,eax
      mov timerhi,edx
      end;  setthreadpriority(getcurrentthread,priority);
      setpriorityclass(getcurrentprocess,priority);
      edit3.Text:=floattostr(timerlo/(1000*delay))+'MHz';
    end;end.