Форум: "WinAPI";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
ВнизCPU Usage under WinXP SP1 Найти похожие ветки
← →
Nick Nifontov (2003-04-29 13:29) [0]Hi!
Возникла проблема - невозможно измерить загруженность CPU под WinXP (обязательно должен быть установлен SP1, иначе все работает). В чем проблема?
Кто чем может помочь?
Вот код, который я использую для замера на NT/2000/XP.
function GetProcessorTime : int64;
type
TPerfDataBlock = packed record
signature : array [0..3] of wchar;
littleEndian : cardinal;
version : cardinal;
revision : cardinal;
totalByteLength : cardinal;
headerLength : cardinal;
numObjectTypes : integer;
defaultObject : cardinal;
systemTime : TSystemTime;
perfTime : comp;
perfFreq : comp;
perfTime100nSec : comp;
systemNameLength : cardinal;
systemnameOffset : cardinal;
end;
TPerfObjectType = packed record
totalByteLength : cardinal;
definitionLength : cardinal;
headerLength : cardinal;
objectNameTitleIndex : cardinal;
objectNameTitle : PWideChar;
objectHelpTitleIndex : cardinal;
objectHelpTitle : PWideChar;
detailLevel : cardinal;
numCounters : integer;
defaultCounter : integer;
numInstances : integer;
codePage : cardinal;
perfTime : comp;
perfFreq : comp;
end;
TPerfCounterDefinition = packed record
byteLength : cardinal;
counterNameTitleIndex : cardinal;
counterNameTitle : PWideChar;
counterHelpTitleIndex : cardinal;
counterHelpTitle : PWideChar;
defaultScale : integer;
defaultLevel : cardinal;
counterType : cardinal;
counterSize : cardinal;
counterOffset : cardinal;
end;
TPerfInstanceDefinition = packed record
byteLength : cardinal;
parentObjectTitleIndex : cardinal;
parentObjectInstance : cardinal;
uniqueID : integer;
nameOffset : cardinal;
nameLength : cardinal;
end;
var
c1,c2,c3:cardinal;
i1,i2:integer;
perfDataBlock:^TPerfDataBlock;
perfObjectType:^TPerfObjectType;
perfCounterDef:^TPerfCounterDefinition;
perfInstanceDef:^TPerfInstanceDefinition;
begin
result:=0;
perfDataBlock:=nil;
try
c1:=$10000;
while true do begin
ReallocMem(perfDataBlock, c1);
c2:=c1;
case RegQueryValueEx(HKEY_PERFORMANCE_DATA,"238",
nil,@c3,pointer(perfDataBlock),@c2) of
ERROR_MORE_DATA: c1:=c1*2;
ERROR_SUCCESS: break;
else exit;
end;
end;
perfObjectType:=pointer(cardinal(perfDataBlock)+perfDataBlock^.headerLength);
for i1:=0 to perfDataBlock^.numObjectTypes-1 do begin
if perfObjectType^.objectNameTitleIndex=238 then begin // 238 -> "Processor"
perfCounterDef:=pointer(cardinal(perfObjectType)+perfObjectType^.headerLength);
for i2:=0 to perfObjectType^.numCounters-1 do begin
if perfCounterDef^.counterNameTitleIndex=6 then begin // 6 -> "% Processor Time"
perfInstanceDef:=pointer(cardinal(perfObjectType)+perfObjectType^.definitionLength);
result:=PInt64(cardinal(perfInstanceDef)+perfInstanceDef^.byteLength+perfCounterDef^.counterOffset)^;
break;
end;
inc(perfCounterDef);
end;
break;
end;
perfObjectType:=pointer(cardinal(perfObjectType)+perfObjectType^.totalByteLength);
end;
finally
FreeMem(perfDataBlock);
end;
end;
var
LastTickCount:cardinal=0;
LastProcessorTime:int64=0;
function GetProcessorUsage : double;
var
tickCount:cardinal;
processorTime:int64;
begin
result:=0;
tickCount:=GetTickCount;
processorTime:=GetProcessorTime;
if (LastTickCount<>0) and (tickCount<>LastTickCount) then
result:=100-((processorTime-LastProcessorTime) div 100)/(tickCount-LastTickCount);
LastTickCount:=tickCount;
LastProcessorTime:=processorTime;
end;
P.S. Ссори за размер письма.
P.S.2 Помогите, очень надо.
With respect,
Nick Nifontov.
← →
PGM (2003-04-30 10:17) [1]Вероятно в SP1. Помнится в MS уже что-то исправили. Утверждают приблизительно следующее - на некоторых(!) машинах некоторые(!) приложения после установки SP1 начинают работать в N раз медленнее. Возможно, что и эта проблема как-то связана. Посмотри на их сайте, там есть заплатка. Может поможет.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c