发信人: 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毫秒