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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.11.2010, 12:09
FReeZ777 FReeZ777 вне форума
Прохожий
 
Регистрация: 03.11.2010
Сообщения: 3
Репутация: 10
Печаль HELP! PLEASE! Непонятная утечка памяти

Здравстуйте, уважаемые формучане!
Я, если честно, запарился.
Написал программу, все превосходно работает, но через определенное время (часа 2) выскакивает "External error". Смотрю в диспетчере - процесс съел около гигабайта оперативной памяти.
Суть программы - грузит из файлов данные, заходит через Webbrowser на страницы, отправляет нужную информацию, и так все в цикле.
Данные грузятся из файлов через Tstringlist, после отправки в нужное место очищается с помощью Free.
Вроде бы все окей, но память утекает как вода.
Вот часть кода, часть убрал из соображений бесполезности.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,URLMon, ComCtrls, math, OleCtrls, SHDocVw, ExtCtrls;
 
type
  TForm1 = class(TForm)
    start: TButton;
    GroupBox1: TGroupBox;
    ScrollBox1: TScrollBox;
 
    ComboBox1: TComboBox;
    Label1: TLabel;
    back: TButton;
    forward: TButton;
    update: TButton;
    stop: TButton;
    Label2: TLabel;
    Button6: TButton;
    Button7: TButton;
    Label3: TLabel;
    Edit1: TEdit;
    Button8: TButton;
    Label4: TLabel;
    Button10: TButton;
    Label5: TLabel;
    Label6: TLabel;
    ComboBox2: TComboBox;
    Button1: TButton;
    Edit2: TEdit;
     webbrowser1:TWEbbrowser;
    procedure ComboBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure stopClick(Sender: TObject);
    procedure updateClick(Sender: TObject);
    procedure forwardClick(Sender: TObject);
    procedure backClick(Sender: TObject);
    procedure startClick(Sender: TObject);
    procedure main();
     procedure load();
    procedure Button7Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure ComboBox2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
      procedure auth();
    procedure ComboBox2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
      l,l1,l2,l5,m,jou,get,get1:tstringlist;
a,y,c,key,st,gg1,doc,tt1:string;
n,i,id,num,id1,ppp,t,gg,form,k,kat,kall,on:integer;
 
implementation
<Левый код>
</ Левый код>
procedure Tform1.auth();
begin
WebBrowser1.Navigate('сайт.ком');
    while   WebBrowser1.ReadyState <> 4 do
begin
Application.ProcessMessages();
end;
  try
 WebBrowser1.OleObject.Document.All.Tags('input').Item(2).click   ;
 except
 
 startClick(self);
 end;
 
 Delay(3000);
 
 while   WebBrowser1.ReadyState <> 4 do
begin
Application.ProcessMessages();
end;
 
 WebBrowser1.OleObject.Document.All.Tags('input').Item(1).Value:=tt1;
 
 WebBrowser1.OleObject.Document.All.Tags('input').Item(2).Value:='1627911';
 
WebBrowser1.OleObject.Document.All.Tags('input').Item(4).Click();
 WebBrowser1.OleObject.Document.All.Tags('input').Item(3).Click();
 end;
procedure TForm1.startClick(Sender: TObject);
 
 begin
 main();
 end;
 procedure Tform1.main();
 var ovElements: OleVariant;
    i: Integer;
begin
kall:=1;
 webbrowser1.Silent:=true;
 
l:=tstringlist.create;
l.LoadFromFile('links.txt');
l2:=tstringlist.create;
l2.loadfromfile('last.txt');
gg1:=l2[0];
l1:=tstringlist.create;
l1.loadfromfile('rev/base'+gg1+'.txt');
 
t:=strtoint(l2[1]);
if t mod 100 = 0 then
begin
Application.ProcessMessages();
   while   WebBrowser1.ReadyState <> 4 do
begin
Application.ProcessMessages();
end;
try
m:=tstringlist.create;
m.loadfromfile('ttt.txt');
l5:=tstringlist.Create;
l5.loadfromfile('get.txt');
tt1:=m[strtoint(l5[0])];
auth();
 if strtoint(l5[0])=m.Count-1 then
begin
 l5[0]:=inttostr(0);
 end
 else
 l5[0]:=inttostr(strtoint(l5[0])+1);
finally
l5.savetofile('get.txt');
l5.Clear;
l5.Free;
m.clear;
m.free;
end;
 delay(4000);
  while   WebBrowser1.ReadyState <> 4 do
begin
Application.ProcessMessages();
 
end;
load();
   end
   else
 
   load();
 
end;
procedure TForm1.load();
var ovElements: OleVariant;
    i: Integer;
begin
try
while   WebBrowser1.ReadyState <> 4 do
begin
Application.ProcessMessages();
end;
 
WebBrowser1.Navigate(l1[t]+'сайт');
//label1.caption:='Òåêóùèé æóðíàë: ' +l1[strtoint(l2[1])];
//label2.caption:='Òåêóùàÿ áàçà:'+l2[0];
  // label2.caption:='Íîìåð æóðíàëà â äàííîé áàçå:'+l2[1];
label5.caption:='Òåêóùèé æóðíàë # '+inttostr(t);
edit2.text:=l1[t];
if t=l1.count-1 then
begin
gg1:=inttostr(strtoint(gg1)+1);
t:=0;
end;
t:=t+1;
 
l2[1]:=inttostr(t);
l2.savetofile('last.txt');
 
delay(500);
 while   WebBrowser1.ReadyState <> 4 do
begin
Application.ProcessMessages();
end;
<Левый код>
</Левый код>
while   WebBrowser1.ReadyState <> 4 do
begin
Application.ProcessMessages();
end;
finally
l1.Clear;
l1.Free;
l2.Clear;
l2.Free;
l.Clear;
l.Free;
end;
 if on<>1 then main();
end;
end;
 
end.
Пожалуйста, помогите!
Ответить с цитированием
  #2  
Старый 25.11.2010, 15:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Похожая ситуация. Создаю новые потоки, ставлю у них FreeOnTerminate = true. Потоки отрабатывают быстро и вырубаются. НО в диспетчере память процесса только растет: изначально 2.5мб, и потом потихоньку увеличивается. Пробовал даже в конце потоков написать Self.Destroy или Self.Free - ноль эмоций.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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