Форум: "Система";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
ВнизПроцессор Найти похожие ветки
← →
Ernar (2002-05-11 22:01) [0]Как можно узнать частоту процессора прямо из програмы?
← →
Song (2002-05-12 10:14) [1]
function GetCPUSpeed: Double;
const
DelayTime = 500;
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
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000 * DelayTime);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Format("Your CPU speed: %f MHz", [GetCPUSpeed]));
end;
← →
Exception (2002-05-12 16:58) [2]Не, ну это не годится :)
Т.е. так можно ПОМЕРЯТЬ частоту самому. А вообще-то можно ее узнать у Windows - довольно просто это можно сделать с исп. WMI (Windows Management Instrumentation). См. MSDN.
← →
Song (2002-05-12 17:45) [3]А что не так?
Для точности раз 5-6 вызовите её и всё.
← →
Андрей Татуков (2002-05-22 16:45) [4]Вызываю. Отбрасываю min и max, остальное - усредняю, считаю
не в МГц, а в КГц - и все равно значения м\отличаться (из-за
выполняющихся паралельных задач ?)
← →
МИФИст (2002-05-22 17:23) [5]WinNT:
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~Mhz
← →
Proton (2002-05-22 21:05) [6]Пример не мой. Но работает точно у меня определил с точностью до мегагейтса :) С ПЕРВГО РАЗА
А вот если на машине несколько процов - наверное поведет себя не прилично.
В апях вроде можно сделать чтоб с потоком работал только один проц - так вот это можно использовать (наверно) :)
// Determinate CPU Freq
//
//
function GetCPUSpeed: 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;
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c