![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно програмно определить тактовую частоту процессора [D5, Win2k]
Abzetdin © (2002-11-29 22:28:00)Друзья, пожалуйста подскажите как можно програмно определить тактовую частоту процессора - с помошью как можно короткого кода.
Благодарю
Ich Hasse (2002-11-30 20:39:00) [1]
string:=Format("CPU.Speed: %f MHz", [GetCPUSpeed]);
Вот этой строчкой можно получить из результата функции стринг.
Ich Hasse (2002-11-30 20:32:00) [2]Именно, и этот код РАБОТАЕТ абсолютно правильно на любых процессорах!!! Я проверял. Частатота с точностью до сотых.
У меня Athlon XP 1500+ программа показала частоту 1333,33 MHz.
Diamond Cat (2002-11-30 01:39:00) [3]2 Ich Hasseесли я правильно понял твой код, то он должен показывать сколько операций совершил процессор за заданный промежуток времени, соответственно при не полной загрузке проца, результат будет не верным, надо вставить какой-нибудь цикл, чтоб подгружать проц
Ich Hasse (2002-11-29 22:38:00) [4]Это, если не через реестр, только соответственно время уйдет 500 мс.
function SpeedCPU: Double;
const
DelayTime = 500;
var
TimerHi : DWORD;
TimerLo : DWORD;
PriorityClass : Integer;
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;
Abzetdin (2002-11-29 22:36:00) [5]To Ich Hasse
Огромное - благодарю
Ich Hasse (2002-11-29 22:32:00) [6]Это из реестра...
function GettingCPUClock: string;
var
m_reg: TRegistry;
begin
m_reg:=TRegistry.Create;
m_reg.RootKey:=HKEY_LOCAL_MACHINE;
try
if m_reg.OpenKey("HARDWARE\DESCRIPTION\System\CentralProcessor\0", True) then
begin
try
Result:="CPUClock: "+IntToStr(m_reg.ReadInteger("~MHz"))+" MHz";
except
Result:="Unknown";
end;
m_reg.CloseKey;
end;
finally
m_reg.Free;
end;
end;