CPU Usage under WinXP SP1
От: radar  
Дата: 29.04.03 09:36
Оценка:
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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.