Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.066 c
1-1195537076
Николай1984
2007-11-20 08:37
2008.07.20
Визуальный дизайнер


3-1198262739
DBUser
2007-12-21 21:45
2008.07.20
Как сделать TRIGGER в Oracle из Delphi?


2-1213731802
batya-x
2008-06-17 23:43
2008.07.20
установка компанента в delhi 2005


8-1183456228
разведчик
2007-07-03 13:50
2008.07.20
Степень "похожести" двух аудио фрагментов


2-1213809311
vegarulez
2008-06-18 21:15
2008.07.20
Как создать exception?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский