![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение названия прцессора и его тактовую частоту [D7, WinXP]
Mr. Who © (2005-01-12 00:56:00)Как получить название прцессора и его тактовую частоту
pavel_guzhanov (2005-01-13 08:40:00) [1]Поищи на этом форуме топики про WMI. Где-то должна быть ссылка на статью про WMI в Delphi. В ней есть пример работы с WMI, в частности, есть пример получения полной информации о процессоре....
Просто Джо (2005-01-13 01:01:00) [2]2 эта функция какую-то ерунду выдаёт:))0
Вопрос на засыпку: А что она, по-вашему, выдавать должна?
(подсказка: телефонный номер Б.Г. ;)
kaZaNoVa (2005-01-13 00:27:00) [3]Alex Konshin © (12.01.05 22:12) [9]
эта функция какую-то ерунду выдаёт:))0
Alex Konshin (2005-01-12 22:12:00) [4]Частота проще всего получается по QueryPerformanceFrequency
kaZaNoVa (2005-01-12 17:29:00) [5]Kerk © (12.01.05 17:10) [7]
ага, но работает))))
Kerk (2005-01-12 17:10:00) [6]kaZaNoVa © (12.01.05 13:29) [4]
если работает, не значит прямой.. изменение приоритета текущего потока.. ужас!!!
kaZaNoVa (2005-01-12 13:49:00) [7]2Freak (12.01.05 13:47) [5]
ага, а если под юзером?
> openkey
по дефайлту пытается открыть с правами на запись ..
2Freak (2005-01-12 13:47:00) [8]Простейший способ
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:29:00) [9]Kerk © (12.01.05 13:07) [3]
но этот код меня ещё не разу не подводил !!!
Kerk (2005-01-12 13:07:00) [10]kaZaNoVa © (12.01.05 12:52) [2]
опять гланды через задницу
kaZaNoVa (2005-01-12 12:52:00) [11]
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.
Просто Джо (2005-01-12 03:42:00) [12]HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0