Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с ОЗУ


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. Жрать - это наверно означает много? А как много?


Наверх

Титульная страница Поиск, карта сайта Написать письмо