Количество активных потоков и загруженность процессора
Материал из DRKB
Количество активных потоков и загруженность процессора[править | править код]
В реестре есть раздел HKEY_DYN_DATA. Основная информация о системе хранится в ключе PerfStats.
О получении информации,например, о загруженности процессора, необходимо проделать следующие шаги:
Для начала необходимо запустить установленный счётчик в реестре. Это возможно путём считывания значения ключа, отвечающего за нужный параметр системы.
Например Просто считываем значение ключа 'PerfStats\StartStat\KERNEL\CPUusage' в секции HKEY_DYN_DATA. данное действие запускает счётчик. После этого в ключе 'PerfStats\StatData\KERNEL\CPUusage' будет храниться значение в процентах о загруженности процессора.
Далее, если добавить считывание загруженности процессора в событие On timer, то мы сможем наблюдать изменение загруженности процессора в динамике.
По завершении, Ваша программа должна остановить счётчик в реестре. Для этого просто считай ключ 'PerfStats\StopStat\KERNEL\CPUusage'.Это остановит счётчик. Так же в системе есть много других счётчиков. Весь список счётчиков можно посмотреть в ключе PerfStats\StatData, используя редактор реестра.
Представленный ниже исходник получает значения всех счётчиков, расположенных в секции HKEY_DYN_DATA.
unit SystemInfo;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TDialupAdapterInfo = record // Информация о Dialup адаптере
alignment: dword;
buffer: dword;
bytesrecieved: dword;
bytesXmit: dword;
ConnectSpeed: dword;
CRC: dword;
framesrecieved: dword;
FramesXmit: dword;
Framing: dword;
runts: dword;
Overrun: dword;
timeout: dword;
totalbytesrecieved: dword;
totalbytesXmit: dword;
end;
type
TKernelInfo = record
CpuUsagePcnt: dword;
Numthreads: dword;
NumVMS: dword;
end;
type
TVCACHEInfo = record
ccurpages: dword;
cMacPages: dword;
cminpages: dword;
FailedRecycles: dword;
Hits: dword;
LRUBuffers: dword;
LRURecycles: dword;
Misses: dword;
RandomRecycles: dword;
end;
type
TFATInfo = record
BreadsSec: dword;
BwritesSec: dword;
Dirtydata: dword;
ReadsSec: dword;
WritesSec: dword;
end;
type
TVMMInfo = record
CDiscards: dword;
CInstancefaults: dword;
CPageFaults: dword;
cPageIns: dword;
cPageOuts: dword;
cpgCommit: dword;
cpgDiskCache: dword;
cpgDiskCacheMac: dword;
cpgDiskCacheMid: dword;
cpgDiskCacheMin: dword;
cpgfree: dword;
cpglocked: dword;
cpglockedNoncache: dword;
cpgother: dword;
cpgsharedpages: dword;
cpgswap: dword;
cpgswapfile: dword;
cpgswapfiledefective: dword;
cpgswapfileinuse: dword;
end;
type
TSysInfo = class(TComponent)
private
fDialupAdapterInfo: TDialupAdapterInfo;
fKernelInfo: TKernelInfo;
fVCACHEInfo: TVCACHEInfo;
fFATInfo: TFATInfo;
fVMMInfo: TVMMInfo;
ftimer: TTimer;
fupdateinterval: integer;
tmp: dword;
vsize: dword;
pkey: hkey;
regtype: pdword;
fstopped: boolean;
procedure fupdatinginfo(Sender: TObject);
procedure fsetupdateinterval(aupdateinterval: integer);
protected
fsysInfoChanged: TNotifyEvent;
public
constructor Create(Aowner: TComponent); override;
destructor Destroy; override;
property DialupAdapterInfo: TDialupAdapterInfo read fDialupAdapterInfo;
property KernelInfo: TKernelInfo read fKernelInfo;
property VCACHEInfo: TVCACHEInfo read fVCACHEInfo;
property FATInfo: TFATInfo read fFATInfo;
property VMMInfo: TVMMInfo read fVMMInfo;
procedure StartRecievingInfo;
procedure StopRecievingInfo;
published
property SysInfoChanged: TNotifyEvent read fsysInfoChanged write fsysInfoChanged;
// Это событие вызывается после определённого интервала времени.
property UpdateInterval: integer read fupdateInterval
write fsetupdateinterval default 5000;
end;
procedure Register;
implementation
constructor TSysInfo.Create(Aowner: TComponent);
begin
inherited;
ftimer := ttimer.Create(self);
ftimer.Enabled := False;
ftimer.OnTimer := fupdatinginfo;
vsize := 4;
fstopped := True;
end;
procedure TSysInfo.startrecievingInfo;
var
res: integer;
begin
res := RegOpenKeyEx(HKEY_DYN_DATA, 'PerfStats\StartStat', 0, KEY_ALL_ACCESS, pkey);
if res <> 0 then
raise Exception.Create('Could not open registry key');
fstopped := False;
// Для Dial Up Адаптера
RegQueryValueEx(pkey, 'Dial-Up Adapter\Alignment', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Buffer', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Framing', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Overrun ', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Timeout', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\CRC', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Runts', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\FramesXmit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\FramesRecvd', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesXmit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesRecvd', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\TotalBytesXmit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\TotalBytesRecvd', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\ConnectSpeed', nil, regtype, @tmp, @vsize);
// Для VCACHE
RegQueryValueEx(pkey, 'VCACHE\LRUBuffers', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\FailedRecycles', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\RandomRecycles', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\LRURecycles', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\Misses', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\Hits', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cMacPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cMinPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cCurPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesXmit', nil, regtype, @tmp, @vsize);
// Для VFAT
RegQueryValueEx(pkey, 'VFAT\DirtyData', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\BReadsSec', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\BWritesSec', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\ReadsSec', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\WritesSec', nil, regtype, @tmp, @vsize);
// Для VMM
RegQueryValueEx(pkey, 'VMM\cpgLockedNoncache', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgCommit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSharedPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMid', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMac', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMin', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcache', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfileDefective', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfileInUse', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfile', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cDiscards', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageOuts', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageIns', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cInstanceFaults', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageFaults', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgOther', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwap', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgLocked', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgFree', nil, regtype, @tmp, @vsize);
// Для KERNEL
RegQueryValueEx(pkey, 'KERNEL\CPUUsage', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'KERNEL\VMs', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'KERNEL\Threads', nil, regtype, @tmp, @vsize);
RegCloseKey(pkey);
ftimer.Enabled := True;
end;
procedure tsysinfo.fupdatinginfo(Sender: TObject);
var
res: integer;
begin
res := RegOpenKeyEx(HKEY_DYN_DATA, 'PerfStats\StatData', 0, KEY_ALL_ACCESS, pkey);
if res <> 0 then
raise Exception.Create('Could not open registry key');
// Для Dial Up Адаптера
RegQueryValueEx(pkey, 'Dial-Up Adapter\Alignment', nil, regtype,
@fDialupAdapterInfo.alignment, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Buffer', nil, regtype,
@fDialupAdapterInfo.buffer, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Framing', nil, regtype,
@fDialupAdapterInfo.framing, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Overrun ', nil, regtype,
@fDialupAdapterInfo.overrun, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Timeout', nil, regtype,
@fDialupAdapterInfo.timeout, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\CRC', nil, regtype, @fDialupAdapterInfo.crc, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Runts', nil, regtype,
@fDialupAdapterInfo.runts, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\FramesXmit', nil, regtype,
@fDialupAdapterInfo.framesxmit, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\FramesRecvd', nil, regtype,
@fDialupAdapterInfo.framesrecieved, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesXmit', nil, regtype,
@fDialupAdapterInfo.bytesxmit, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesRecvd', nil, regtype,
@fDialupAdapterInfo.bytesrecieved, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\TotalBytesXmit', nil, regtype,
@fDialupAdapterInfo.totalbytesxmit, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\TotalBytesRecvd', nil, regtype,
@fDialupAdapterInfo.totalbytesrecieved, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\ConnectSpeed', nil, regtype,
@fDialupAdapterInfo.connectspeed, @vsize);
// Для VCACHE
RegQueryValueEx(pkey, 'VCACHE\LRUBuffers', nil, regtype, @fVCACHEInfo.lrubuffers, @vsize);
RegQueryValueEx(pkey, 'VCACHE\FailedRecycles', nil, regtype,
@fVCACHEInfo.failedrecycles, @vsize);
RegQueryValueEx(pkey, 'VCACHE\RandomRecycles', nil, regtype,
@fVCACHEInfo.randomrecycles, @vsize);
RegQueryValueEx(pkey, 'VCACHE\LRURecycles', nil, regtype, @fVCACHEInfo.lrurecycles, @vsize);
RegQueryValueEx(pkey, 'VCACHE\Misses', nil, regtype, @fVCACHEInfo.misses, @vsize);
RegQueryValueEx(pkey, 'VCACHE\Hits', nil, regtype, @fVCACHEInfo.hits, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cMacPages', nil, regtype, @fVCACHEInfo.cmacpages, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cMinPages', nil, regtype, @fVCACHEInfo.cminpages, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cCurPages', nil, regtype, @fVCACHEInfo.ccurpages, @vsize);
// Для VFAT
RegQueryValueEx(pkey, 'VFAT\DirtyData', nil, regtype, @ffatinfo.dirtydata, @vsize);
RegQueryValueEx(pkey, 'VFAT\BReadsSec', nil, regtype, @ffatinfo.breadssec, @vsize);
RegQueryValueEx(pkey, 'VFAT\BWritesSec', nil, regtype, @ffatinfo.bwritessec, @vsize);
RegQueryValueEx(pkey, 'VFAT\ReadsSec', nil, regtype, @ffatinfo.readssec, @vsize);
RegQueryValueEx(pkey, 'VFAT\WritesSec', nil, regtype, @ffatinfo.writessec, @vsize);
// Для VMM
RegQueryValueEx(pkey, 'VMM\cpgLockedNoncache', nil, regtype,
@fvmminfo.cpglockednoncache, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgCommit', nil, regtype, @fvmminfo.cpgcommit, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSharedPages', nil, regtype, @fvmminfo.cpgsharedpages, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMid', nil, regtype, @fvmminfo.cpgdiskcacheMid, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMac', nil, regtype, @fvmminfo.cpgdiskcacheMac, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMin', nil, regtype, @fvmminfo.cpgdiskcacheMin, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcache', nil, regtype, @fvmminfo.cpgdiskcache, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfileDefective', nil, regtype,
@fvmminfo.cpgswapfiledefective, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfileInUse', nil, regtype,
@fvmminfo.cpgswapfileinuse, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfile', nil, regtype, @fvmminfo.cpgswapfile, @vsize);
RegQueryValueEx(pkey, 'VMM\cDiscards', nil, regtype, @fvmminfo.cdiscards, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageOuts', nil, regtype, @fvmminfo.cpageouts, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageIns', nil, regtype, @fvmminfo.cpageins, @vsize);
RegQueryValueEx(pkey, 'VMM\cInstanceFaults', nil, regtype, @fvmminfo.cinstancefaults, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageFaults', nil, regtype, @fvmminfo.cpagefaults, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgOther', nil, regtype, @fvmminfo.cpgother, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwap', nil, regtype, @fvmminfo.cpgswap, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgLocked', nil, regtype, @fvmminfo.cpglocked, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgFree', nil, regtype, @fvmminfo.cpgfree, @vsize);
// Для KERNEL
RegQueryValueEx(pkey, 'KERNEL\CPUUsage', nil, regtype, @fkernelinfo.cpuusagepcnt, @vsize);
RegQueryValueEx(pkey, 'KERNEL\VMs', nil, regtype, @fkernelinfo.numvms, @vsize);
RegQueryValueEx(pkey, 'KERNEL\Threads', nil, regtype, @fkernelinfo.numThreads, @vsize);
RegCloseKey(pkey);
if assigned(SysInfoChanged) then
SysInfoChanged(self);
end;
procedure TSysInfo.stoprecievingInfo;
var
res: integer;
begin
res := RegOpenKeyEx(HKEY_DYN_DATA, 'PerfStats\StopStat', 0, KEY_ALL_ACCESS, pkey);
if not fstopped then
begin
if res <> 0 then
raise Exception.Create('Could not open registry key');
// Для Dial Up Адаптера
RegQueryValueEx(pkey, 'Dial-Up Adapter\Alignment', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Buffer', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Framing', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Overrun ', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Timeout', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\CRC', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\Runts', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\FramesXmit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\FramesRecvd', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesXmit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesRecvd', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\TotalBytesXmit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\TotalBytesRecvd', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\ConnectSpeed', nil, regtype, @tmp, @vsize);
// Для VCACHE
RegQueryValueEx(pkey, 'VCACHE\LRUBuffers', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\FailedRecycles', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\RandomRecycles', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\LRURecycles', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\Misses', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\Hits', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cMacPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cMinPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VCACHE\cCurPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'Dial-Up Adapter\BytesXmit', nil, regtype, @tmp, @vsize);
// Для VFAT
RegQueryValueEx(pkey, 'VFAT\DirtyData', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\BReadsSec', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\BWritesSec', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\ReadsSec', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VFAT\WritesSec', nil, regtype, @tmp, @vsize);
// Для VMM
RegQueryValueEx(pkey, 'VMM\cpgLockedNoncache', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgCommit', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSharedPages', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMid', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMac', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcacheMin', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgDiskcache', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfileDefective', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfileInUse', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwapfile', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cDiscards', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageOuts', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageIns', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cInstanceFaults', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cPageFaults', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgOther', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgSwap', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgLocked', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'VMM\cpgFree', nil, regtype, @tmp, @vsize);
// Для KERNEL
RegQueryValueEx(pkey, 'KERNEL\CPUUsage', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'KERNEL\VMs', nil, regtype, @tmp, @vsize);
RegQueryValueEx(pkey, 'KERNEL\Threads', nil, regtype, @tmp, @vsize);
RegCloseKey(pkey);
ftimer.Enabled := False;
fstopped := True;
end;
end;
procedure TSysInfo.fsetupdateinterval(aupdateinterval: integer);
begin
if (ftimer <> nil) and (aupdateinterval > 0) then
begin
ftimer.Interval := aupdateinterval;
fupdateinterval := aupdateinterval;
end;
if (ftimer <> nil) and (aupdateinterval = 0) then
begin
ftimer.Interval := 500;
fupdateinterval := 500;
end;
end;
destructor TSysInfo.Destroy;
begin
StopRecievingInfo;
ftimer.Destroy;
inherited;
end;
procedure Register;
begin
RegisterComponents('Samples', [TSysInfo]);
end;
Скопируйте это в файл SystemInfo.pas и проинсталлируйте его.
Author: Vimil Saju
ID: 01427