![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с ОЗУ
Res © (2008-06-21 13:01:00)Здравствуйте. Имеется приложение,многопоточное. С каждым запуском потока,приложение начинает жрать все больше и больше ОЗУ. Никак не могу найти в чем проблема.
Потоки запускаются с помошью BeginThread, уничтожаются - ExitThread(0);
Используемые функции(наверно в них проблема):
function setcookie(page,cookie:string):string;
var
int:array[1..5] of integer;
cook:Tstrings;
x,leng,del:integer;
temp:string;
find:boolean;
begin
cook:=Tstringlist.Create;
leng:=length(cookie);
for x:=1 to leng do
begin
if(cookie[x]=';') or (cookie[x]=' ') or (x=leng) then
begin
if(x=leng) then temp:=temp+cookie[x];
if(temp<>'') then
begin
cook.Add(temp);
end;
temp:='';
continue;
end;
temp:=temp+cookie[x];
end;
//Список
int[1]:=Pos('Set-Cookie: ',page);
while(int[1]>0) do
begin
find:=false;
int[2]:=PosEx(';',page,int[1]+1);
if(int[2]=0) then continue;
temp:=copy(page,int[1]+12,int[2]-int[1]-12);
if(temp='') then continue;
x:=0;
leng:=cook.Count-1; //Длина Strings
del:=Pos('deleted',temp);
while(x<=leng) do
begin
if(AnsiLowerCase(copy(temp,1,Pos('=',temp)))=AnsiLowerCase(copy(cook.Strings[x], 1,Pos('=',cook.Strings[x])))) then
begin
find:=true;
if(del=0) then
begin
cook.Strings[x]:=temp;
end
else
begin
cook.Delete(x);
x:=x-1;
leng:=leng-1;
end;
end;
Inc(x);
end;
if(find=false) then
begin
if(Pos(copy(temp,1,Pos('=',temp)),cook.Text)=0) then
begin
cook.Add(temp);
end;
end;
int[1]:=PosEx('Set-Cookie: ',page,int[1]+1);
end;
//Генерируем строку кукисов
leng:=cook.Count-1;
temp:='';
for x:=0 to leng do
begin
temp:=temp+cook.Strings[x]+'; ';
end;
result:=copy(temp,1,length(temp)-2);
cook.Free;
end;
function getpage(url,cook,proxy:string):string;
var
idhttp:Tidhttp;
data:TstringStream;
tmp:integer;
begin
idhttp:=Tidhttp.Create(nil);
data:=TstringStream.Create('');
idhttp.ReadTimeout:=60000;
idhttp.RecvBufferSize:=1024;
idhttp.Request.CustomHeaders.Text:='Cookie: '+cook;
idhttp.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; WOW64; SV1; MRA 5.0 (build 02094); .NET CLR 2.0.50727)';
if(proxy<>'') then
begin
tmp:=Pos(':',proxy);
try
idhttp.ProxyParams.ProxyServer:=copy(proxy,1,tmp-1);
idhttp.ProxyParams.ProxyPort:=strtoint(copy(proxy,tmp+1,length(proxy)));
except
end;
end;
try
idhttp.Get(url,data)
except
end;
result:=idhttp.Response.RawHeaders.GetText+#13#10#13#10+data.DataString;
data.Free;
idhttp.Free;
end;
Заранее благодарен за советы
Сергей М. (2008-06-22 20:22:00) [1]
> как тогда разрушать поток, чтобы освобождались ВСЕ ресурсы
> созданные потоком?
1. Не путай разрушение (потока как объекта) и завершение (поточной функции) - это две разные разные разницы.
2. Освобождай САМ.
Res (2008-06-22 20:14:00) [2]Всем спасибо большое за советы, помогло
Сергей М. (2008-06-22 20:08:00) [3]
> а как тогда убивать поток?
Не надо его "убивать", он сам "умрет", когда придет время.
Вызвав BeginThread ты передал ей параметром адрес своей самой обычнойфункции, которая должна быть выполнена в контексте создаваемого потока. Вот и завершай свою функцию обычным образоми не трогай никакие EndThread/ExitThread
Правильный-Вася (2008-06-22 19:03:00) [4]
> > в коде ни одной зашиты ресурсаможно поподробней?
создал объект, не забудь его освободить
читать try finally в букваре
DrPass (2008-06-22 13:32:00) [5]Ты, видимо, не совсем понимаешь, что такое "поток". Поток - это не какой-то обособленный участок кода, чем-то отличающийся от остальных.
Это, очень грубо говоря, указатель на место в программе, которое сейчас выполняется.
Играл в детстве в игрушки, где надо кидать кубик и двигать по карте фишки? А в каждой клетке, где стала фишка, надо чего-то делать? Программа - примерно то же самое. Карта - это код твоей программы. Потоки - это те самые фишки. Они "двигаются" по коду и выполняют то, что находится в клетке. Никакими ресурсами они сами по себе не обладают. Поэтому ты сам должен ослеживать - если ты где-то выделил память, не забудь ее вручную же освободить когда она тебе не нужна, независимо от того, это делалось в основном потоке или не в основном.
Res (2008-06-22 12:06:00) [6]А как тогда разрушать поток, чтобы освобождались ВСЕ ресурсы созданные потоком?
DrPass (2008-06-22 02:26:00) [7]
> При этом освобождаются все ресурсы операционной системы,
> выделенные дан ному потоку
Слово "поток" здесь обозначает вполне конкретный объект системы. Все то, что насоздают/навыделяют процедуры и функции, выполняющиеся в контексте этого потока, не относится к "данному потоку". И, естественно, не освобождается при вызове ExitThread
Res (2008-06-22 01:55:00) [8]
> 2. Твои мемлики происходят как минимум при вызове тобой
> ExitThread
Поток можно завершить принудительно, вызвав:
VOID ExitThread(DWORD dwExitCоde);
При этом освобождаются все ресурсы операционной системы, выделенные дан ному потоку
Res (2008-06-22 01:53:00) [9]
> 2. Твои мемлики происходят как минимум при вызове тобой
> ExitThread
а как тогда убивать поток?
> в коде ни одной зашиты ресурса
можно поподробней?
Сергей М. (2008-06-21 22:40:00) [10]
> Res (21.06.08 13:01)
1. Твое приложение, как и любое другое Win-приложение, неимеет доступа к ОЗУ.
2. Твои мемлики происходят как минимум при вызове тобой ExitThread
Anatoly Podgoretsky (2008-06-21 22:22:00) [11]Какой еще MemProof или FastMM, в коде ни одной зашиты ресурса, только один странный except end;
Игорь Шевченко (2008-06-21 22:06:00) [12]MemProof или FastMM в руки
Res (2008-06-21 21:44:00) [13]Как оказалась, жрет оперативку данная функция, но я не могу понять, почему?
function getpage(url,cook,proxy:string):string;
var
idhttp:Tidhttp;
data:TstringStream;
tmp:integer;
begin
idhttp:=Tidhttp.Create(nil);
data:=TstringStream.Create('');
idhttp.Request.CustomHeaders.Text:='Cookie: '+cook;
idhttp.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; WOW64; SV1; MRA 5.0 (build 02094); .NET CLR 2.0.50727)';
if(proxy<>'') then
begin
tmp:=Pos(':',proxy);
try
idhttp.ProxyParams.ProxyServer:=copy(proxy,1,tmp-1);
idhttp.ProxyParams.ProxyPort:=strtoint(copy(proxy,tmp+1,length(proxy)));
except
end;
end;
try
idhttp.Get(url,data)
except
end;
result:=idhttp.Response.RawHeaders.GetText+#13#10#13#10+data.DataString;
data.Free;
idhttp.Free;
end;
Res (2008-06-21 16:29:00) [14]free-proxy.jino-net.ru/f.txt.. незнаю, почему то не добавлялась она :(
Res (2008-06-21 16:26:00) [15]Может в этой функции проблема? больше нигде не может быть..
Res (2008-06-21 13:48:00) [16]ок, спасибо
Игорь Шевченко (2008-06-21 13:45:00) [17]
> Используемые функции(наверно в них проблема):
проблема в другом месте
Res (2008-06-21 13:21:00) [18]1.Проблема
2. Task Manager
3. 300мб и продолжало жрать, но я вырубил
palva (2008-06-21 13:12:00) [19]
> приложение начинает жрать все больше и больше ОЗУ.
1. Это разве проблема
2. Как вы это определяете
3. Жрать - это наверно означает много? А как много?