04.10.2010, 10:13
|
Прохожий
|
|
Регистрация: 04.10.2010
Сообщения: 1
Репутация: 10
|
|
посчитать % загрузки процессора для процесса
Доброго времени суток. Нужна помощь уважаемых форумчан.
Есть два списка процессов, полученных с помощью ToolHelp API и PSAPI. Подскажите как на основе этих списков получить процент загрузки процессора для каждого процесса?
ЗЫ: win7, delphi 7
Код:
unit lab1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TlHelp32, psapi, ExtCtrls;
type
TGlavnayaForma = class(TForm)
Zagolovok: TLabel;
VIXOD: TButton;
NadpisTool: TLabel;
NadpisPSAPI: TLabel;
LaunchPR: TButton;
tlhwind: TMemo;
psapiwind: TMemo;
KolvoTLH: TLabel;
KolvoPSAPI: TLabel;
Kolvopr1: TEdit;
kolvopr2: TEdit;
Refr: TTimer;
Stop: TButton;
wait01: TRadioButton;
wait1: TRadioButton;
wait05: TRadioButton;
wait5: TRadioButton;
NadpZAD: TLabel;
procedure VIXODClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure RefrTimer(Sender: TObject);
procedure LaunchPRClick(Sender: TObject);
procedure StopClick(Sender: TObject);
procedure wait1Click(Sender: TObject);
procedure wait01Click(Sender: TObject);
procedure wait05Click(Sender: TObject);
procedure wait5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
GlavnayaForma: TGlavnayaForma;
implementation
{$R *.dfm}
procedure GetProcessList (var line1,line2:TStrings);
var
pe:TprocessEntry32;
ph,snap:Thandle;
mh:Hmodule;
procs:array[0..$fff] of dword;
cnt,cnt1,count,cm: cardinal;
i:integer;
ModName:array [0..max_path] of char;
begin
cnt:=0;
cnt1:=0;
line1.Clear;
line2.Clear;
//èñïîëüçóåì Tool Help API
snap:=CreateToolHelp32Snapshot(th32cs_snapprocess,0);
if integer(snap)=-1 then
begin
exit;
end
else
begin
pe.dwSize:=sizeof(pe);
If process32First(snap,pe) then
repeat
line1.add(string(pe.szExeFile));
cnt:=cnt+1;
until not process32Next(snap,pe);
end;
GlavnayaForma.Kolvopr1.Text:=FloatTOStr(cnt);
//èñïîëüçóåì PSAPI
if not EnumProcesses(@procs, sizeof(procs), count) then
begin
exit;
end;
for i := 0 to count div 4 - 1 do
begin
ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
false, procs[i]);
if ph > 0 then
begin
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
line2.Add(ExtractFilename(string(ModName)));
CloseHandle(ph);
end;
cnt1:=cnt1+1;
end;
GlavnayaForma.kolvopr2.Text:=FloatToStr(cnt1);
end;
procedure TGlavnayaForma.VIXODClick(Sender: TObject);
begin
close;
end;
procedure TGlavnayaForma.FormCreate(Sender: TObject);
begin
tlhwind.Clear;
psapiwind.Clear;
end;
procedure TGlavnayaForma.RefrTimer(Sender: TObject);
var
tmp1:Tstrings;
tmp2:TStrings;
begin
tmp1:=tlhwind.Lines;
tmp2:=psapiwind.Lines;
getProcessList(tmp1,tmp2);
end;
procedure TGlavnayaForma.LaunchPRClick(Sender: TObject);
begin
refr.Enabled:=true;
end;
procedure TGlavnayaForma.StopClick(Sender: TObject);
begin
refr.Enabled:=false;
end;
procedure TGlavnayaForma.wait1Click(Sender: TObject);
begin
refr.Interval:=1000;
end;
procedure TGlavnayaForma.wait01Click(Sender: TObject);
begin
refr.Interval:=100;
end;
procedure TGlavnayaForma.wait05Click(Sender: TObject);
begin
refr.Interval:=500;
end;
procedure TGlavnayaForma.wait5Click(Sender: TObject);
begin
refr.Interval:=5000;
end;
end.
|