发信人: wpf (卧龙在田), 信区: BorlandDev
标  题: 得到主频
发信站: 哈工大紫丁香 (2001年06月03日13:24:47 星期天), 站内信件


标  题: Re: 怎么获取CPU的主频!
发信站: BBS 水木清华站 (Sun Jun  3 10:38:27 2001)

一般有两种办法:读注册表和计算
下面分别给出两种办法的实现

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  ValueBuf: array[0..1000] of char;
implementation
{$R *.DFM}
procedure getCPUInfo;
const
  Subkey: string = 'HARDWARE\DESCRIPTION\System\CentralProcessor\0';
var
  hkSB: HKEY;
  rType: LongInt;
  ValueSize, OrigSize: Longint;
  MHZ:DWORD;
begin
  if RegOpenKeyEx(HKEY_LOCAL_MACHINE, PChar(Subkey), 0,
                  KEY_READ, hkSB) = ERROR_SUCCESS then
 //打开键HKEY_LOCAL_MACHINE\ HARDWARE\DESCRIPTION\System\Central Processor\0
成功
  try
    OrigSize := sizeof(ValueBuf);
    ValueSize := OrigSize;
    rType := REG_SZ;
   //供应商标志为REG_SZ类型
    if RegQueryValueEx(hkSB, 'VendorIdentifier', nil, @rType,
      @ValueBuf, @ValueSize) = ERROR_SUCCESS then
    Form1.Memo1.Lines.Add('供应商标志:'+ValueBuf);
 //读取键VendorIdentifier数据,得到供应商标志
    ValueSize := OrigSize;
    rType := REG_SZ;
//产品型号标志为REG_SZ类型
    if RegQueryValueEx(hkSB, 'Identifier', nil, @rType,
      @ValueBuf, @ValueSize) = ERROR_SUCCESS then
    Form1.Memo1.Lines.Add('产品型号标志:'+ValueBuf);
//读取键Identifier数据,得到产品型号标志
    ValueSize := OrigSize;
    rType := REG_DWORD;
  // CPU主频为REG_DWORD类型
    if RegQueryValueEx(hkSB, '~MHz', nil, @rType,
      @MHZ, @ValueSize) = ERROR_SUCCESS then
    Form1.Memo1.Lines.Add('CPU主频:'+inttostr(MHZ)+' MHZ(方法1)');
//读取键~MHz数据,得到CPU主频
  finally
    RegCloseKey(hkSB);
   //关闭打开的键
  end;
end;
function getCPUSpeed: Double;
const
  DelayTime = 500;
var
  TimerHi, TimerLo: DWORD;
  PriorityClass, Priority: Integer;
begin
try
  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);
  //延时500毫秒
  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);
 //运算得到CPU主频,单位为MHZ
  except end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  MHZ:string;
begin
 getCPUInfo;
 MHZ:=Format('CPU主频:%f MHz(方法2)', [getCPUSpeed]);
 Memo1.Lines.Add(MHZ);
end;
end.
end.

【 在 delphi32 (落花吹雪) 的大作中提到: 】
: 白云黄鹤有一张贴子里有个例程,可以去看看


--
  爱美女不爱江山
    要地狱不要天堂

据说呆娃儿不笨

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.245.166]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.885毫秒