Форум: "Начинающим";
Текущий архив: 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.5 MB
Время: 0.042 c