Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
ВнизПолучение названия прцессора и его тактовую частоту Найти похожие ветки
← →
Mr. Who © (2005-01-12 00:56) [0]Как получить название прцессора и его тактовую частоту
← →
Просто Джо © (2005-01-12 03:42) [1]HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
← →
kaZaNoVa © (2005-01-12 12:52) [2]
program Project1;
{$R *.res}
uses Windows;
Var s:string;
function GetCPUSpeed: real;
function IsCPUID_Available: Boolean; assembler; register;
asm
PUSHFD { прямой доступ к флагам невозможен, только через стек }
POP EAX { флаги в EAX }
MOV EDX,EAX { сохраняем текущие флаги }
XOR EAX,$200000 { бит ID не нужен }
PUSH EAX { в стек }
POPFD { из стека в флаги, без бита ID }
PUSHFD { возвращаем в стек }
POP EAX { обратно в EAX }
XOR EAX,EDX { проверяем, появился ли бит ID }
JZ @exit { нет, CPUID не доступен }
MOV AL,True { Result=True }
@exit:
end;
function hasTSC: Boolean;
var
Features: Longword;
begin
asm
MOV Features,0 { Features = 0 }
PUSH EBX
XOR EAX,EAX
DW $A20F
POP EBX
CMP EAX,$01
JL @Fail
XOR EAX,EAX
MOV EAX,$01
PUSH EBX
DW $A20F
MOV Features,EDX
POP EBX
@Fail:
end;
hasTSC := (Features and $10) <> 0;
end;
const
DELAY = 500;
var
TimerHi, TimerLo: Integer;
PriorityClass, Priority: Integer;
begin
Result := 0;
if not (IsCPUID_Available and hasTSC) then Exit;
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,
THREAD_PRIORITY_TIME_CRITICAL);
SleepEx(10, FALSE);
asm
DB $0F { $0F31 op-code for RDTSC Pentium инструкции }
DB $31 { возвращает 64-битное целое (Integer) }
MOV TimerLo,EAX
MOV TimerHi,EDX
end;
SleepEx(DELAY, FALSE);
asm
DB $0F { $0F31 op-code для RDTSC Pentium инструкции }
DB $31 { возвращает 64-битное целое (Integer) }
SUB EAX,TimerLo
SBB EDX,TimerHi
MOV TimerLo,EAX
MOV TimerHi,EDX
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000 * DELAY);
end;
begin
Str(GetCPUSpeed:7:1,s);
MessageBox(0,Pchar(s+" MZ"),"Частота процессора",0);
end.
← →
Kerk © (2005-01-12 13:07) [3]kaZaNoVa © (12.01.05 12:52) [2]
опять гланды через задницу
← →
kaZaNoVa © (2005-01-12 13:29) [4]Kerk © (12.01.05 13:07) [3]
но этот код меня ещё не разу не подводил !!!
← →
2Freak (2005-01-12 13:47) [5]Простейший способ
function GetCpuMhz: Real;
begin
with tregistry.Create do
begin
rootkey := HKEY_LOCAL_MACHINE;
openkey("\hardware\description\system\centralprocessor\0\", false);
result := readinteger("~mhz");
free;
end;
end;
← →
kaZaNoVa © (2005-01-12 13:49) [6]2Freak (12.01.05 13:47) [5]
ага, а если под юзером?
> openkey
по дефайлту пытается открыть с правами на запись ..
← →
Kerk © (2005-01-12 17:10) [7]kaZaNoVa © (12.01.05 13:29) [4]
если работает, не значит прямой.. изменение приоритета текущего потока.. ужас!!!
← →
kaZaNoVa © (2005-01-12 17:29) [8]Kerk © (12.01.05 17:10) [7]
ага, но работает))))
← →
Alex Konshin © (2005-01-12 22:12) [9]Частота проще всего получается по QueryPerformanceFrequency
← →
kaZaNoVa © (2005-01-13 00:27) [10]Alex Konshin © (12.01.05 22:12) [9]
эта функция какую-то ерунду выдаёт:))0
← →
Просто Джо © (2005-01-13 01:01) [11]2 эта функция какую-то ерунду выдаёт:))0
Вопрос на засыпку: А что она, по-вашему, выдавать должна?
(подсказка: телефонный номер Б.Г. ;)
← →
pavel_guzhanov (2005-01-13 08:40) [12]Поищи на этом форуме топики про WMI. Где-то должна быть ссылка на статью про WMI в Delphi. В ней есть пример работы с WMI, в частности, есть пример получения полной информации о процессоре....
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c