Реклама

четверг, 11 ноября 2010 г.

Пишем робота Урок №11

Тестируем классы на утечку памяти (GlobalMemoryStatus, MemAvail).

 

В этом уроке вам понадобиться материал (программные коды) предыдущих уроков:
Сначала мы проверим класс TPASSPriceSource. Это можно сделать вот такой программкой (кинем сперва на форму компонент TListBox и назовем его lbMemory) :
procedure TfrmMomentum.itLoadClick(Sender: TObject);
var lpBuffer: TMemoryStatus; i:integer;
begin
     GlobalMemoryStatus(lpBuffer);
     lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
     FloatToStr(lpBuffer.dwAvailVirtual));
     if odOpenDialog.Execute then
     begin
        for i:=1 to 100 do
        begin
            if FPriceSource<>nil then FreeAndNil(FPriceSource);
            FPriceSource:=TPASSPriceSource.Create(odOpenDialog.FileName,false);
            FPriceSource.LoadDataFromTextFile(odOpenDialog.FileName);
        end;
     end;
     lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
     FloatToStr(lpBuffer.dwAvailVirtual))
end;
вот что она нам выдаст:
утечка памяти (GlobalMemoryStatus, MemAvail)
Как видим, после ста создаваний и удалений объекта объем памяти не уменьшился. Следовательно, в этом классе утечки памяти нет.
Сделаем еще один тест. Закомментарим строку
FPriceSource.LoadDataFromTextFile(odOpenDialog.FileName);
и увеличим количество повторений цикла до 100000. Смотрим результат:

Теперь перейдем к классу TPASSMomentum:
procedure TfrmMomentum.btnTestClick(Sender: TObject);
var lpBuffer: TMemoryStatus; i:integer;
begin
      GlobalMemoryStatus(lpBuffer);
      lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
              FloatToStr(lpBuffer.dwAvailVirtual));
      for i:=1 to 100000 do
      begin
         if FIndicator<>nil then FreeAndNil(FIndicator);
         FIndicator:=TPASSMomentum.Create(3,'Close');
      end;
      lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
              FloatToStr(lpBuffer.dwAvailVirtual))
end;
Вот что выдала программа:
Как видим, и в этом классе тоже не возникает утечки памяти.
Теперь проверим класс TPASSStatAnalizMomentum:
procedure TfrmMomentum.btnTestClick(Sender: TObject);
var lpBuffer: TMemoryStatus; i:integer; SA:TPASSStatAnalizMomentum;
begin
    GlobalMemoryStatus(lpBuffer);
    lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
    FloatToStr(lpBuffer.dwAvailVirtual));
    for i:=1 to 100000 do
    begin
         SA:=TPASSStatAnalizMomentum.Create(nil,10, nil);
         SA.Free;
    end;
    lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
    FloatToStr(lpBuffer.dwAvailVirtual))
end;
Вот что выдала нам программа:
утечка памяти (GlobalMemoryStatus, MemAvail)
На этом мы закончим тестирование классов, класс TPASSStatStoreDataList проверять не будем, он является вспомогательным, но если хотите, то протестируйте его самостоятельно и убедитесь, что и  в нем нет утечки памяти.