потоки

  • Автор темы Sliva
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Sliva

Гость
#1
Посмотрите, пожалуйста - все ли я верно делаю. У меня задача - вывести информацию о владельцах самого большого количества блоков.
Вот код:
Код:
procedure Tfm.btnResClick(Sender: TObject);
var proc: TProcessEntry32;
hp : THeapEntry32;
hpL :THeapList32;
sizemax: integer;
i,j: integer;
snap, curSnap: THandle; // снимки
li: TListItem;
ok: boolean;

begin
proc.dwSize:=SizeOf(proc);  // размер потока
hp.dwSize:=SizeOf(hp); // размер блока
hpL.dwSize:=SizeOf(hpL); // размер кучи
sizemax:= hp.dwSize; // за максимальный размер берем первый
mm.Lines.Clear;

Snap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); // делаю снимок
if Process32First(Snap, proc) then 
repeat
i:=0;
CurSnap := CreateToolHelp32Snapshot(TH32CS_SNAPHEAPLIST, proc.th32ProcessID);
if Heap32ListFirst(CurSnap, hpL) then	
repeat
if Heap32First(hp, hpL.th32ProcessID, hpL.th32HeapID) then 
repeat
if (hp.dwBlockSize > sizemax) then
begin
sizemax:=hp.dwBlockSize;
inc(i);
break;
end;
until not Heap32Next(hp);

until not Heap32ListNext(CurSnap, hpL);
if i>0 then
begin
memo.Lines.Add('ID владельца '+IntToStr(hp.th32ProcessID));
memo.Lines.Add('ID процесса'+IntToStr(proc.th32ProcessID));
memo.Lines.Add('размер блока '+IntToSTr(hp.dwBlockSize));
end;
CloseHandle(CurSnap);
until not Process32Next(Snap, proc);
CloseHandle(Snap);
end;
Тут что-то не так, потому что зацикливается программа
 
B

Barmutik

Гость
#2
Оно не виснет ... оно столько работает ... вы перебираете все выделенные блоки .. а их там Оооооооочень много ...
 
S

Sliva

Гость
#3
Это что же получается, что я не правильно считаю???? Т.е. задача написана неверно?
 
B

Barmutik

Гость
#4
Просто не совсем что Вам надо сделать... а таким способом пока Вы пробегаетесь по всем выделнным сегментам в куче .. занимает вагон времени .. с тележкой ...
 
B

Barmutik

Гость
#6
Как стоит задача полностью?

Потому что Вы написали о владельце самого большого количества блока .. а саим ищите у каждого процеса максимального размера выделынный блок ...
 
S

Sliva

Гость
#7
Выдать информацию о владельцах самого большого числа блоков :blink:
 
B

Barmutik

Гость
#10
Ну я рад что всё получилось ... а то я только собрался начать пробовать что там у Вас не так .. Ну и в чём была проблема ?
 
S

Sliva

Гость
#11
Просмотр нужно вести по-другому :)
Но задачу приняли, сказав, что так тоже можно, но излишне каждый раз заходить в цикл
Repeat
.....
until not Process32Next(Snap, proc);
 
Статус
Закрыто для дальнейших ответов.