Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2012, 00:55   #1
FLIER
Пользователь
 
Регистрация: 28.12.2007
Сообщений: 39
Восклицание TidHttp в потоке(утечка памяти)

Добрый день.Создаю поток, а в нем циклические get запросы веб-серверу. Через некоторое время поток не удается заморозить (Suspend) а так-же используемая память постоянно растет.

Код:
...
type
 ThreadHTTP=class(TThread)
 private
  http1, http2:TidHttp;
  ssl1, ssl2: TIdSSLIOHandlerSocketOpenSSL;
  cookieall: TIdCookieManager;
  sList:tStringList;
  n:integer;
  vs:TMainVS;
  quit:boolean;
  PotokNum:integer;
 public
  procedure Execute;override;
  procedure ShowResult;
end;
...

procedure ThreadHTTP.Execute;//Подготавливаем поток к работе
var
host1,host2,link1,link2:string;
begin
  inherited;
   sList:= TStringList.Create;
   cookieall :=  TIdCookieManager.Create;
   ssl1    :=  TIdSSLIOHandlerSocketOpenSSL.Create;
   ssl2   :=  TIdSSLIOHandlerSocketOpenSSL.Create;
   vs.list1 := TStringList.Create; vs.list1.Clear;
   vs.list2 := TStringList.Create; vs.list2.Clear;
    case vs.BkVsBk of
     1:begin
        host1 := 'wap.site1.com';
        host2 := 'www.site2.com';
        vs.link1 := 'https://site1'+vs.link1;
        vs.link2 := 'http://site2'+vs.link2;
       end;
     end;
   http1 := TIdHttp.Create(nil); //Настройка первого idHttp
   http1.IOHandler := ssl1;
   http1.CookieManager := cookieall;
   http1.AllowCookies := true;
   http1.HandleRedirects := true;
   http1.Request.Host:= host1;
   http1.Request.UserAgent:='Nokia6630/1.0 (2.3.129) SymbianOS/8.0 Series60/2.6 Profile/MIDP-2.0 Configuration/CLDC-1.1';
   http1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
   http1.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
   http1.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
   http1.ConnectTimeout := 2000;

   http2 := TIdHttp.Create(nil); //Настройка второго idHttp
   http2.IOHandler := ssl2;
   http2.CookieManager := cookieall;
   http2.AllowCookies := true;
   http2.HandleRedirects := true;
   http2.Request.Host:= host2;
   http2.Request.UserAgent:='Nokia6630/1.0 (2.3.129) SymbianOS/8.0 Series60/2.6 Profile/MIDP-2.0 Configuration/CLDC-1.1';
   http2.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
   http2.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
   http2.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
   http2.ConnectTimeout := 2000;

   quit := False;
   n:=0;
   while  (true) do
     begin
      try
       vs.list1.Clear;
       vs.list2.Clear;
       vs.list1.Text := http1.Get(vs.link1);
       vs.list2.Text := http2.Get(vs.link2);
       vs.Error := 0;
      except
        if (http1.ResponseText <> 'HTTP/1.1 200 OK')  or (http2.ResponseText <> 'HTTP/1.1 200 OK') then
         begin
          vs.Error := 1
         end else
         begin
          vs.Error := 2;
         end;
      end;
     Synchronize(ShowResult);
     http1.Disconnect;
     http2.Disconnect;
     vs.list1.Clear;
     vs.list2.Clear;
     sleep(1000);
    end;
end;
...
Дальше в Synchronize(ShowResult); забираю html код из 2-х TidHttp для парсинга. Мне нужно несколько таких потоков запускать одновременно, для разных ресурсов.

Подскажите пожалуйста, как лучше организовать задуманное, так как надежность и скорость работы - основная прерогатива.
FLIER вне форума Ответить с цитированием
Старый 06.10.2012, 01:09   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

По существу идей не могу подсказать (все же ночь уже), но что-то у вас в коде не вижу ни одного освобождения tidhttp.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.10.2012, 01:10   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

где хоть один Free?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.10.2012, 01:16   #4
FLIER
Пользователь
 
Регистрация: 28.12.2007
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
где хоть один Free?
А где освобождать ?
при синхронизации или после
vs.list1.Text := http1.Get(vs.link1);
vs.list2.Text := http2.Get(vs.link2); ?

Хороший ли это тон, делать в потоке бесконечный цикл ?

Последний раз редактировалось FLIER; 06.10.2012 в 01:19.
FLIER вне форума Ответить с цитированием
Старый 06.10.2012, 01:28   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Когда поток отмирает, тогда и освободи.
Создавай в конструкторе, разрушай к деструкторе.
Человек_Борща вне форума Ответить с цитированием
Старый 06.10.2012, 01:43   #6
FLIER
Пользователь
 
Регистрация: 28.12.2007
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Когда поток отмирает, тогда и освободи.
Создавай в конструкторе, разрушай к деструкторе.
Если я правильно понимаю, он должен отмирать после того как заберет код 2-х страниц. Но мне нужны ежесекундные обновления котировок, для этого написал бесконечный цикл внутри потока. Следовательно он не отмирает вовсе.

Может как-то иначе реализовать ?
FLIER вне форума Ответить с цитированием
Старый 07.10.2012, 16:00   #7
FLIER
Пользователь
 
Регистрация: 28.12.2007
Сообщений: 39
По умолчанию

Господа, подскажите, пожалуйста, как организовать циклическое обновление двух веб-страниц в потоке, без утечки и зависания потока.
FLIER вне форума Ответить с цитированием
Старый 07.10.2012, 21:35   #8
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Правило № 1:

Занял ресурс
try
.. поработал с ресурсом
finally
.. БЕЗУСЛОВНО освободил ресурс
end;
xoodoo вне форума Ответить с цитированием
Старый 07.10.2012, 21:42   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Если я правильно понимаю,
Не правильно.
У любого класса есть конструктор и есть деструктор.
Стандартный сэмпл TThread их не определяет, и дает вам только метод Execute.
И это печально...

В секции public вашего TThread создайте эти 2 метода. Как это делать, написано в любой книге по ООП в Delphi.
Человек_Борща вне форума Ответить с цитированием
Старый 30.10.2012, 11:32   #10
FLIER
Пользователь
 
Регистрация: 28.12.2007
Сообщений: 39
По умолчанию

Большой спасибо всем отписавшимся. Написал конструктор и деструктор - всё работает как нужно.

Думаю можно закрывать.
FLIER вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти Juffin Общие вопросы Delphi 3 02.11.2010 12:11
Утечка памяти ZvEr_HaCkEr Свободное общение 13 24.09.2010 19:30
Indy в потоке - утечка памяти PUH Фриланс 5 28.12.2009 14:06
Indy в потоке - утечка памяти PUH Помощь студентам 0 25.12.2009 12:27
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24