Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Процессор [D6, Win95/98, WinXP]


Ernar ©   (2002-05-11 22:01:00) 

Как можно узнать частоту процессора прямо из програмы?


Proton   (2002-05-22 21:05:00) [1]

Пример не мой. Но работает точно у меня определил с точностью до мегагейтса :) С ПЕРВГО РАЗА
А вот если на машине несколько процов - наверное поведет себя не прилично.
В апях вроде можно сделать чтоб с потоком работал только один проц - так вот это можно использовать (наверно) :)
// 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;


МИФИст   (2002-05-22 17:23:00) [2]

WinNT:

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~Mhz


Андрей Татуков   (2002-05-22 16:45:00) [3]

Вызываю. Отбрасываю min и max, остальное - усредняю, считаю
не в МГц, а в КГц - и все равно значения м\отличаться (из-за
выполняющихся паралельных задач ?)


Song   (2002-05-12 17:45:00) [4]

А что не так?
Для точности раз 5-6 вызовите её и всё.


Exception   (2002-05-12 16:58:00) [5]

Не, ну это не годится :)
Т.е. так можно ПОМЕРЯТЬ частоту самому. А вообще-то можно ее узнать у Windows - довольно просто это можно сделать с исп. WMI (Windows Management Instrumentation). См. MSDN.


Song   (2002-05-12 10:14:00) [6]


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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо