unit Unit1;
interface
uses
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 .
`