![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день. Есть вроде бы стандартный код для отображения загрузки процессора на основе adCpuUsage
Код:
uses Gauges; (*в оригинале сам компонент на форму не ставится*)
.....
implementation
{$R *.dfm}
uses adCpuUsage;
procedure TForm2.FormCreate(Sender: TObject);
var
I:integer;
Gauge: TGauge;
begin
for i:=1 to GetCPUCount-1 do
begin
try
Gauge:=TGauge.Create(Form2);
Gauge.Name:=Format('Gauge%d',[i]);
with TGauge(FindComponent(Format('Gauge%d',[i]))) do
begin
Parent:=StatusBar;
Top:=2;
Width:=100;
Height:=18;
Left:=((i-1)*Width);
MinValue:=0;
MaxValue:=100;
ForeColor:=clGreen;
end;
except
//
end;
end;
end;
procedure TForm2.Timer2Timer(Sender: TObject);
var
n:Integer;
CPU : Integer;
begin
CollectCPUData;
for n:=1 to GetCPUCount-1 do
begin
TGauge(FindComponent('Gauge'+IntToStr(n))).Progress:=StrToInt(Format('%0.0f%',[GetCPUUsage(n)*100]));
CPU:=StrToInt(Format('%0.0f%',[GetCPUUsage(n)*100]));
end;
end;и все вроде бы работает, но если добавить Код:
initialization ReportMemoryLeaksOnShutdown := true; end. то становится видна утечка памяти при закрытии формы. видимо дело в Gauge:=TGauge.Create(Form2); и в отсутствии соотвественно деструктора Вопрос: как правильно при закрытии приложения уничтожить компонент, чтоб не было утечки памяти? |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
если вместо TGauge использовать TChart (а там нет никакого СОЗДАТЬ) все равно таже самая утечка памяти. похоже что не так с adCpuUsage.pas
как локализовать код создающий утечку? чтоб потом доработать |
|
#4
|
||||
|
||||
|
А зачем вы через FindComponent все это делаете? Почему не завести сразу массив TGauge?
|
|
#5
|
|||
|
|||
|
проблема не в FindComponent, даже если все упростить
Код:
implementation
{$R *.dfm}
uses adCpuUsage;
procedure TForm2.Timer1Timer(Sender: TObject);
var i: Integer;
begin
CollectCPUData; (*ПОЛУЧИТЬ ДАННЫЕ ДЛЯ ВСЕХ ПРОЦЕССОРОВ*)
for i:=0 to GetCPUCount-1 do (*показать данные для каждого процессора*)
Memo1.Lines[i]:=Format('CPU #%d - %5.2f%%',[i,GetCPUUsage(i)*100]);
end;
initialization
ReportMemoryLeaksOnShutdown := true;
end.утечка памяти все равно есть |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
|||
|
|||
|
уже не причем, но проблема все еще остается, нет ли мыслей по поводу работы модуля? в интернете его так просто не посмотреть но могу тут выложить, если интересно
|
|
#8
|
||||
|
||||
|
Цитата:
|
|
#9
|
|||
|
|||
|
само собой надо, никто в этом не сомневается ни секунды
вопрос каким способом найти утечку? |
|
#10
|
||||
|
||||
|
Я когда-то делал компонент на чьем-то примере. Работает через библиотеку PDH.DLL (кажись, taskmgr.exe ее использует). Можно взять получение загрузки оттуда (на сам компонент внимания не обращать
). По номеру ЦПУ (1, 2..) можно узнавать загрузку отдельного ядра, 0 - весь проц. |
| Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
Pcrepair (31.05.2013)
| ||
|
#11
|
|||
|
|||
|
примера по использованию случайно нет?
|
|
#12
|
||||
|
||||
|
Цитата:
Если без компонента, то достаточно создать по обьекту класса TPDHQuery и TCounter, в конструкторе TCounter первый параметр - обьект класса TPDHQuery, второй параметр - номер ЦПУ (в пред. посте ошибся - для всего проца "-1", для первого ядра - "0"). Код:
var FQuery:TPDHQuery;
counter:TObject;
...................
procedure Init;
var cnt:TCounter;
begin
FQuery:=TPDHQuery.Create;
Cnt:=TCounter.Create(FQuery, -1);
counter:=cnt;
end;
Function GetCpuLoad:single;
begin
FQuery.Refresh;
Result:=TCounter(counter).Value;
end; |
| Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
Pcrepair (02.06.2013)
| ||