Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.05.2013, 16:43
Pcrepair
 
Сообщения: n/a
По умолчанию 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  
Старый 31.05.2013, 16:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Pcrepair
то становится видна утечка памяти при закрытии формы. видимо дело в Gauge:=TGauge.Create(Form2); и в отсутствии соотвественно деструктора
Вопрос: как правильно при закрытии приложения уничтожить компонент, чтоб не было утечки памяти?
Компонент сам уничтожится как только будет уничтожен его владелец или родитель - в данном случае это Form2 или StatusBar.
Ответить с цитированием
  #3  
Старый 31.05.2013, 17:01
Pcrepair
 
Сообщения: n/a
По умолчанию

если вместо TGauge использовать TChart (а там нет никакого СОЗДАТЬ) все равно таже самая утечка памяти. похоже что не так с adCpuUsage.pas
как локализовать код создающий утечку? чтоб потом доработать
Ответить с цитированием
  #4  
Старый 31.05.2013, 17:15
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А зачем вы через FindComponent все это делаете? Почему не завести сразу массив TGauge?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 31.05.2013, 17:36
Pcrepair
 
Сообщения: n/a
По умолчанию

проблема не в 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  
Старый 31.05.2013, 17:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Pcrepair
проблема не в 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.

утечка памяти все равно есть
Ну так в таком случае причём тут TGauge?
Ответить с цитированием
  #7  
Старый 31.05.2013, 18:13
Pcrepair
 
Сообщения: n/a
По умолчанию

уже не причем, но проблема все еще остается, нет ли мыслей по поводу работы модуля? в интернете его так просто не посмотреть но могу тут выложить, если интересно
Ответить с цитированием
  #8  
Старый 31.05.2013, 18:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Pcrepair
уже не причем, но проблема все еще остается, нет ли мыслей по поводу работы модуля? в интернете его так просто не посмотреть но могу тут выложить, если интересно
Мысль по поводу работы модуля по-моему очевидная: "утечки памяти нужно устранять".
Ответить с цитированием
  #9  
Старый 31.05.2013, 18:22
Pcrepair
 
Сообщения: n/a
По умолчанию

само собой надо, никто в этом не сомневается ни секунды
вопрос каким способом найти утечку?
Ответить с цитированием
  #10  
Старый 31.05.2013, 20:08
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Я когда-то делал компонент на чьем-то примере. Работает через библиотеку PDH.DLL (кажись, taskmgr.exe ее использует). Можно взять получение загрузки оттуда (на сам компонент внимания не обращать ). По номеру ЦПУ (1, 2..) можно узнавать загрузку отдельного ядра, 0 - весь проц.
Вложения
Тип файла: rar CPUUseGraph.rar (6.1 Кбайт, 7 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
Pcrepair (31.05.2013)
  #11  
Старый 01.06.2013, 11:58
Pcrepair
 
Сообщения: n/a
По умолчанию

примера по использованию случайно нет?
Ответить с цитированием
  #12  
Старый 01.06.2013, 23:18
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Цитата:
Сообщение от Pcrepair
примера по использованию случайно нет?
В Delphi 7 достаточно открыть файл .dpk, Сompile -> Install ->Yes, компонент установится во вкладку Samples. Компонент бросать на форму...
Если без компонента, то достаточно создать по обьекту класса 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)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter