Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.20;
Скачать: CL | DM;

Вниз

проблема с ОЗУ   Найти похожие ветки 

 
Res   (2008-06-21 13:01) [0]

Здравствуйте. Имеется приложение,многопоточное. С каждым запуском потока,приложение начинает жрать все больше и больше ОЗУ. Никак не могу найти в чем проблема.
Потоки запускаются с помошью 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;


Заранее благодарен за советы


 
palva ©   (2008-06-21 13:12) [1]


> приложение начинает жрать все больше и больше ОЗУ.

1. Это разве проблема
2. Как вы это определяете
3. Жрать - это наверно означает много? А как много?


 
Res   (2008-06-21 13:21) [2]

1.Проблема
2. Task Manager
3. 300мб и продолжало жрать, но я вырубил


 
Игорь Шевченко ©   (2008-06-21 13:45) [3]


> Используемые функции(наверно в них проблема):


проблема в другом месте


 
Res   (2008-06-21 13:48) [4]

ок, спасибо


 
Res   (2008-06-21 16:26) [5]

Может в этой функции проблема? больше нигде не может быть..


 
Res   (2008-06-21 16:29) [6]

free-proxy.jino-net.ru/f.txt.. незнаю, почему то не добавлялась она :(


 
Res   (2008-06-21 21:44) [7]

Как оказалась, жрет оперативку данная функция, но я не могу понять, почему?

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;


 
Игорь Шевченко ©   (2008-06-21 22:06) [8]

MemProof или FastMM в руки


 
Anatoly Podgoretsky ©   (2008-06-21 22:22) [9]

Какой еще MemProof или FastMM, в коде ни одной зашиты ресурса, только один странный except end;


 
Сергей М. ©   (2008-06-21 22:40) [10]


> Res   (21.06.08 13:01) 


1. Твое приложение, как и любое другое Win-приложение, не имеет доступа к ОЗУ.

2. Твои мемлики происходят как минимум при вызове тобой ExitThread


 
Res   (2008-06-22 01:53) [11]


> 2. Твои мемлики происходят как минимум при вызове тобой
> ExitThread

а как тогда убивать поток?

> в коде ни одной зашиты ресурса

можно поподробней?


 
Res   (2008-06-22 01:55) [12]


> 2. Твои мемлики происходят как минимум при вызове тобой
> ExitThread

Поток можно завершить принудительно, вызвав:

   VOID ExitThread(DWORD dwExitCоde);

При этом освобождаются все ресурсы операционной системы, выделенные дан ному потоку


 
DrPass ©   (2008-06-22 02:26) [13]


> При этом освобождаются все ресурсы операционной системы,
>  выделенные дан ному потоку

Слово "поток" здесь обозначает вполне конкретный объект системы. Все то, что насоздают/навыделяют процедуры и функции, выполняющиеся в контексте этого потока, не относится к "данному потоку". И, естественно, не освобождается при вызове ExitThread


 
Res   (2008-06-22 12:06) [14]

А как тогда разрушать поток, чтобы освобождались ВСЕ ресурсы созданные потоком?


 
DrPass ©   (2008-06-22 13:32) [15]

Ты, видимо, не совсем понимаешь, что такое "поток". Поток - это не какой-то обособленный участок кода, чем-то отличающийся от остальных.
Это, очень грубо говоря, указатель на место в программе, которое сейчас выполняется.
Играл в детстве в игрушки, где надо кидать кубик и двигать по карте фишки? А в каждой клетке, где стала фишка, надо чего-то делать? Программа - примерно то же самое. Карта - это код твоей программы. Потоки - это те самые фишки. Они "двигаются" по коду и выполняют то, что находится в клетке. Никакими ресурсами они сами по себе не обладают. Поэтому ты сам должен ослеживать - если ты где-то выделил память, не забудь ее вручную же освободить когда она тебе не нужна, независимо от того, это делалось в основном потоке или не в основном.


 
Правильный-Вася   (2008-06-22 19:03) [16]


> > в коде ни одной зашиты ресурсаможно поподробней?

создал объект, не забудь его освободить
читать try finally в букваре


 
Сергей М. ©   (2008-06-22 20:08) [17]


> а как тогда убивать поток?


Не надо его "убивать", он сам "умрет", когда придет время.

Вызвав BeginThread ты передал ей параметром адрес своей самой обычной функции, которая должна быть выполнена в контексте создаваемого потока. Вот и завершай свою функцию обычным образом и не трогай никакие EndThread/ExitThread


 
Res   (2008-06-22 20:14) [18]

Всем спасибо большое за советы, помогло


 
Сергей М. ©   (2008-06-22 20:22) [19]


> как тогда разрушать поток, чтобы освобождались ВСЕ ресурсы
> созданные потоком?


1. Не путай разрушение (потока как объекта) и завершение (поточной функции) - это две разные разные разницы.

2. Освобождай САМ.



Страницы: 1 вся ветка

Текущий архив: 2008.07.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
15-1212432475
@!!ex
2008-06-02 22:47
2008.07.20
Нужен хост под SVN.


15-1211970166
Randew
2008-05-28 14:22
2008.07.20
Вредно ли мышке постоянно "светится"?


15-1212455954
brother
2008-06-03 05:19
2008.07.20
Мерцание 2х LCD мониторов (LG)


11-1191870302
LazyBob
2007-10-08 23:05
2008.07.20
List View непойму никак..


3-1202505930
DiX
2008-02-09 00:25
2008.07.20
Сортировка таблицы