Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2015, 23:30   #1
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию Утечка памяти

Доброго времени суток! Это снова я. На этот раз такая проблема:
Написал программу, все работает, все отлично НО, скорость работы снижается, по-видимому где то происходит утечка памяти(или что это без понятия) используемая память постоянно растет и в конечном итоге программа зависает полностью.
Вопрос: Что не так и почему зависает? Сам новичок в этом деле и разобраться самостоятельно не в силах. Буду рад любой помощи
Сам подозреваю что в WebBrowser где то скапливается информация и не очищается, но где понять не могу
КОД:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    Label2: TLabel;
    StaticText3: TStaticText;
    Label3: TLabel;
    StaticText4: TStaticText;
    ListBox1: TListBox;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
    public
    procedure check;
  end;

var
  Form1: TForm1;
  str,str2:TStringList;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i,x:integer;
begin
if OpenDialog1.Execute then
begin
str:=TstringList.Create;
str2:=TstringList.Create;
s:=OpenDialog1.Filename;
str.LoadFromFile(s);
str2.LoadFromFile(s);
Label1.Caption:=intToStr(str.Count);
For i:=0 to str.Count-1 do
  begin
  s:=Str[i];
  x:=Pos(';',s);
  if x=0 then
  x:=Pos(':',s);
  Delete(s,x,length(s)-x+1);
  str[i]:=s;
  end;
end;
end;


procedure TMyThread.Execute;
begin
Synchronize(check);
end;

procedure TMyThread.check;
var
a:  variant;
ovElements: OleVariant;
s:string;
i,j,k,g:integer;
begin
k:=0;
while str.count<>k do begin
Form1.Edit1.Text:=str[k];
Form1.WebBrowser1.Navigate('ссылка на страницу');
while Form1.WebBrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
  ovElements := Form1.WebBrowser1.OleObject.Document.forms.item(0).elements;
  for i := 0 to (ovElements.Length - 1) do
    begin
    If (ovElements.item(i).name='email') Then ovElements.item(i).value:=Form1.Edit1.Text;
    if ovElements.item(i).value =('text')  then //###########################
    ovElements.item(i).Click;
    end;
    While Pos('Код страницы',Form1.WebBrowser1.OleObject.Document.documentElement.innerHTML)=0 do
      begin
      if pos('Код страницы',Form1.WebBrowser1.OleObject.Document.documentElement.innerText)<>0 then
      break;
      Application.ProcessMessages
      end;
      if Pos('Код страницы',Form1.WebBrowser1.OleObject.Document.documentElement.innerHTML)<>0 then
        begin
        inc(g);
        Form1.ListBox1.Items.Add(str2[k]);
        Form1.Label3.Caption:=IntToStr(g);
        end;
Form1.WebBrowser1.Free;
inc(k);
Form1.Label2.Caption:=IntToStr(k);
end;
ShowMessage('Код страницы');
Form1.WebBrowser1.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
TMyThread.Create(False);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Items.SaveToFile(ExtractFilePath( ParamStr(0) ) + dateToStr(Now) + '.txt');
end;

end.

Последний раз редактировалось Vlad2891; 26.02.2015 в 23:45.
Vlad2891 вне форума Ответить с цитированием
Старый 26.02.2015, 23:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
str:=TstringList.Create;
str2:=TstringList.Create;
А где освобождение сих переменок?
Вынеси эти строки в OnCreate формы.
Цитата:
Application.ProcessMessages
В потоке?
Убирай. Нечего ему там делать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.02.2015, 23:55   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Код:
str:=TstringList.Create;
str2:=TstringList.Create;
сразу навскидку спрошу: а где
Код:
str.free;
str2.free;
?

тред, кстати, ты используешь неправильно. впустую. матчасть подтяни, небось спёр кусок говнокода и не в курсе, чо происходит внутри него.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.02.2015, 00:09   #4
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Код:
str:=TstringList.Create;
str2:=TstringList.Create;
сразу навскидку спрошу: а где
Код:
str.free;
str2.free;
?

тред, кстати, ты используешь неправильно. впустую. матчасть подтяни, небось спёр кусок говнокода и не в курсе, чо происходит внутри него.
Правильно. Thread использую только чтобы окно не висло. Еще только учусь ими пользоваться
Vlad2891 вне форума Ответить с цитированием
Старый 27.02.2015, 00:10   #5
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А где освобождение сих переменок?
Вынеси эти строки в OnCreate формы.

В потоке?
Убирай. Нечего ему там делать.
Без Application.ProcessMessages не знаю как сделать ожидание загрузки WebBrowser
Только что вроде дошло, как сделать без Application.ProcessMessages....
Однако проблема с памятью остается

str.free; и str2.free; в данном коде можно же делать только в конце процедуры TMyThread.check. Или я не прав? Если где то в другом месте освобождать ошибку выдаст, у меня же они используются еще внутри TMyThread.check....
Может я жутко туплю, но прошу отнестись с пониманием

Последний раз редактировалось Vlad2891; 27.02.2015 в 00:21.
Vlad2891 вне форума Ответить с цитированием
Старый 27.02.2015, 00:20   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Правильно. Thread использую только чтобы окно не висло.
Без Application.ProcessMessages не знаю как сделать ожидание загрузки WebBrowser
ну вот, задатки ума присутствуют, молодец!
теперь мощная инъекция матчасти по тредам и прогресс будет налицо!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.02.2015, 07:56   #7
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
ну вот, задатки ума присутствуют, молодец!
теперь мощная инъекция матчасти по тредам и прогресс будет налицо!
Что я получил пройдя по ссылке
Vlad2891 вне форума Ответить с цитированием
Старый 27.02.2015, 11:35   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
str.free; и str2.free; в данном коде можно же делать только в конце процедуры TMyThread.check. Или я не прав?
Нет не прав. Сделай в создании формы и в разрушении формы.
Цитата:
Что я получил пройдя по ссылке
Это теория. А что не так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.02.2015, 12:42   #9
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нет не прав. Сделай в создании формы и в разрушении формы.

Это теория. А что не так?
Это теория, которую я же перечитал, но все эти странички выглядят как пазл, собрав который можно понять что же такое потоки и как с ними работать.
Эх...мне бы книжечку почитать какую
p.s. если правильно освободить str и str2 то память перестанет перегружаться?
p.p.s. без Application.ProcessMessages все же виснет намертво, как реализовать по-другому я не знаю
p.p.p.s Если я освобождаю str; str2; то данные хранящиеся в них тоже удалятся, а они мне еще нужны в цикле. Попробовал переписать в ListBox и потом освободить их. Разницы нет. Может это из-за того что я не чищу куки и не перезагружаю сессию после каждой итерации в цикле?

Последний раз редактировалось Vlad2891; 27.02.2015 в 13:30.
Vlad2891 вне форума Ответить с цитированием
Старый 27.02.2015, 13:22   #10
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Вместо Free рекомендуется использовать FreeAndNil, тогда объект точно будет уничтожен из памяти.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти :( batnik.com C++ Builder 1 09.05.2013 18:09
Утечка памяти forivanb Общие вопросы Delphi 4 11.04.2012 15:28
Утечка памяти Juffin Общие вопросы Delphi 3 02.11.2010 12:11
Утечка памяти ZvEr_HaCkEr Свободное общение 13 24.09.2010 19:30
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24