|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
TGauge и утечка памяти
Добрый день. Есть вроде бы стандартный код для отображения загрузки процессора на основе 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)
|