Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
28-05-2007 22:18 | Сообщение от автора вопроса
Большое спасибо всем кто помог разобраться мне с этим вопросом.
Интересно, почему ВСЕ рассматривают assembler как панацею от всех бед??
Дело в том что я только начал разбираться в ASM-е.
DRON, большое человеческое СПАИБО!
Если не сложно хотелось бы комментарий к:
function GetCPUName:string;
type
TRegisters=record
case Integer of
0:(EAX,EBX,ECX,EDX:Cardinal);
1:(Str:array[0..15] of Char);
end;
function IsCPUID_Available:Boolean; register;
asm
PUSHFD
POP EAX
MOV EDX, EAX
XOR EAX, $200000;
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX, EDX
SETNZ AL
end;
procedure GetCPUID(Param:Cardinal; var Registers:TRegisters); register;
asm
PUSH EBX
PUSH EDI
MOV EDI, Registers
XOR EBX, EBX
XOR ECX, ECX
XOR EDX, EDX
CPUID
MOV TRegisters(EDI).&EAX, EAX
MOV TRegisters(EDI).&EBX, EBX
MOV TRegisters(EDI).&ECX, ECX
MOV TRegisters(EDI).&EDX, EDX
POP EDI
POP EBX
end;
var
Registers:TRegisters;
begin
Result:='';
if not IsCPUID_Available then Exit;
GetCPUID($80000000,Registers);
if Registers.EAX>=$80000004 then begin
GetCPUID($80000002,Registers);
Result:=Result+Registers.Str;
GetCPUID($80000003,Registers);
Result:=Result+Registers.Str;
GetCPUID($80000004,Registers);
Result:=Result+Registers.Str;
end;
end;
>>> HKEY_DYN_DATA
Такой ветки в реестре больше нет, а если и есть то полагаться на данные, даваемые ею очень опрометчиво, читайте информацию по WMI - кое что из того, что вам нужно там точно есть. Если бы вы поискали информацию про загрузку памяти, то легко нашли бы GlobalMemoryStatus. То же касается всей остальной информации.
для определения % загрузки CPU
написал следующий код:
(использовал примеры из DRKB)
function NtQuerySystemInformation (
SystemInformationClass : DWORD; // тип требуемой информации
SystemInformation : Pointer; // указатель на буфер, в который вернется информация
SystemInformationLength : DWORD; // размер буфера в байтах
var ReturnLength : DWORD // сколько байт было возвращено или требуется
) : DWORD; stdcall; external 'ntdll.dll';
var
nOldIdleTime : int64 = 0;
nOldSystemTime : int64 = 0;
nNewCPUTime : double = 0;
{ ......................... }
function CPUUsage : string;
type
SYSTEM_BASIC_INFORMATION = packed record
SYSTEM_PERFORMANCE_INFORMATION = packed record
nIdleTime : int64;
dwSpare : array [0..75] of DWORD;
end;
const
SystemBasicInformation = 0;
SystemTimeOfDayInformation = 3;
SystemPerformanceInformation = 2;
var
SBI : SYSTEM_BASIC_INFORMATION;
STI : SYSTEM_TIME_INFORMATION;
SPI : SYSTEM_PERFORMANCE_INFORMATION;
dummy : DWORD;
begin
if NTQuerySystemInformation (SystemBasicInformation,
@SBI,
SizeOf (SYSTEM_BASIC_INFORMATION),
dummy) = NO_ERROR then
if NTQuerySystemInformation (SystemTimeOfDayInformation,
@STI,
SizeOf (SYSTEM_TIME_INFORMATION),
dummy) = NO_ERROR then
if NTQuerySystemInformation (SystemPerformanceInformation,
@SPI,
SizeOf (SYSTEM_PERFORMANCE_INFORMATION),
dummy) = NO_ERROR then
begin
if (nOldIdleTime <> 0) then
begin
nNewCPUTime := RoundTo( (100 - ((SPI.nIdleTime - nOldIdleTime)
/ (STI.nKeSystemTime - nOldSystemTime) * 100)
/ SBI.bKeNumberProcessors + 0.5),-2);
if (nNewCPUTime <> nOldIdleTime) then
result := FloatToStr(nNewCPUTIME);
считаю "Замечание модератора"
СОВЕРШЕННО НЕ ОБОСНОВАННЫМ !!!
Зато теперь у модератора появились основания закрыть ваш вопрос! ;-Р За препирательство с модератором! ;-)))))))
А если серьёзно, то ситуация такая: во-первых, если бы я считал, что в offtopic-вопросах есть все нужные вам ответы, ваш вопрос вообще бы не попал на Круглый стол. Именно поэтому я вопрос пропустил, но тут же указал, что по крайней мере один ответ вы могли бы найти самостоятельно. Во-вторых, если вы выполнили правила сайта и действительно прочитали offtopic-вопросы, нашли там, как измерить загрузку процессора, но вам этот ответ не подошёл, то вам следовало написать в своём вопросе, почему он вам не подошёл. Тогда бы вопросов к вам не было. А сейчас из вашего вопроса не видно, что вы смотрели offtopic-вопросы, а раз так, то замечание модератора совершенно обосновано.
хотелось бы обсудить определение % загрузки CPU через
HKEY_DYN_DATA PerfStats\StartStat\KERNEL\CPUusage,
а по поводу типа CPU:
То что в HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor\VendorIdentifier можно найти так:
А вы, когда задавали вопрос, не обратили внимания, что по правилам сайта вы сначала должны прочитать список offtopic-вопросов и убедиться, что вашего вопроса там нет? Например, вопрос по загрузке процессора там есть.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.