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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2014, 14:20   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию idHTTP Free или Disconnect?

Привет!

Пишу так:
Код:
form1.idHTTP1.Create();
form1.idHTTP1.HandleRedirects:=true;
form1.idHTTP1.Request.UserAgent:='Mozilla/5.0 bla bla bla';
form1.idHTTP1.ReadTimeout:=10000;

// здесь код

form1.IdHTTP1.Free;
получаю ошибку: Access violation ad addres 004C4B4C in module 'название проги.exe'. Write of address 00000030.

Сам код выполняется в цикле и ошибка происходит тогда когда код начинает выполняться повторно.

А так прога робит без проблем:

Код:
form1.idHTTP1.Create();
form1.idHTTP1.HandleRedirects:=true;
form1.idHTTP1.Request.UserAgent:='Mozilla/5.0 bla bla bla';
form1.idHTTP1.ReadTimeout:=10000;

// здесь код

form1.IdHTTP1.Disconnect;

Но не могу выяснить, один момент, прога робит, робит, а потом сама по себе останавливается не доделав задание. Причем объем обрабатываемой инфы достаточно велик. Вот думаю из-за того, что я использую Disconnect а не Free.

Как быть?

Последний раз редактировалось bilibian; 17.02.2014 в 14:23.
bilibian вне форума Ответить с цитированием
Старый 17.02.2014, 14:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
form1.idHTTP1.Create();
Что за бред?
Код:
form1.idHTTP1:=TIdHTTP.Create(nil);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.02.2014, 14:33   #3
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
form1.idHTTP1:=TIdHTTP.Create(nil);
Код:
form1.idHTTP1:=TIdHTTP.Create(nil);
form1.idHTTP1.HandleRedirects:=true;
form1.idHTTP1.Request.UserAgent:='Mozilla/5.0';
form1.idHTTP1.ReadTimeout:=10000;

// code
    
form1.IdHTTP1.Free;
Ошибки нет, но и код не выполняется.

Выкладываю более подробный код.

Код:
procedure Thread.Execute;
  var
    html:string;
begin
  while L.Terminated=false do
  begin
    form1.idHTTP1:=TIdHTTP.Create(nil);
    form1.idHTTP1.HandleRedirects:=true;
    form1.idHTTP1.Request.UserAgent:='Mozilla/5.0';
    form1.idHTTP1.ReadTimeout:=10000;

    html:=form1.IdHTTP1.Get('https://site.ru/');
    form1.Memo1.Text:=html;

    form1.IdHTTP1.Free;
    sleep(5000);
  end;
end;
В итоге мемо пустой!

Последний раз редактировалось Stilet; 17.02.2014 в 15:36.
bilibian вне форума Ответить с цитированием
Старый 17.02.2014, 14:47   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Зачем вообще в потоке упоминание Form1? Объявите idHTTP1 в Execute. Form1. вообще удалите из кода. Free нужен без вариантов. Перед ним Disconnect, в этом не уверен, нужен ди обязательно, мало практики. К Memo из потока нельзя так просто, используйте синхронизацию
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.02.2014, 15:03   #5
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
используйте синхронизацию
А как мне передать в процедуру синхронизации переменную html?

Например вот так не получится:
Код:
Synchronize(Update(html));
Даже если передавать в глобальную переменную, а потом ее в Update отлавливать, то тут другой нюанс. Что если потоков, скажем, 20. Эту переменную будут дергать туда сюда и ситуация может быть непредсказуемая.
bilibian вне форума Ответить с цитированием
Старый 17.02.2014, 15:34   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А как мне передать в процедуру синхронизации переменную html?
Вынесите её объявление в private потока
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.02.2014, 15:40   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
  tt=class(TThread)
    public
    html:string; idHTTP1:TIdHTTP;
    procedure Execute; override;
    procedure Update;

  end;
Код:

  TForm1 = class(TForm)
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ tt }

procedure tt.Execute;
begin
        idHTTP1:=TIdHTTP.Create(nil);
        idHTTP1.HandleRedirects:=true;
        idHTTP1.Request.UserAgent:='Mozilla/5.0';
        idHTTP1.ReadTimeout:=10000;
     while Terminated=false do
      begin

        html:=IdHTTP1.Get('https://site.ru/');
        Synchronize(Update)


        sleep(5000);
      end;
     IdHTTP1.Free;
end;

procedure tt.Update;
begin
        form1.Memo1.Text:=html;

end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.02.2014, 16:20   #8
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Код:
type
  TT = class(TThread)
    html:string;
    IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Update;
  end;
Код:
procedure TT.Update;
begin
  form1.Memo1.Lines.Add(html);
end;
Код:
procedure TT.Execute;
begin

    idHTTP1:=TIdHTTP.Create(nil);
    idHTTP1.HandleRedirects:=true;
    idHTTP1.Request.UserAgent:='Mozilla/5.0';
    idHTTP1.ReadTimeout:=10000;

    while Terminated=false do
    begin
      html:=IdHTTP1.Get('https://google.com/');
      Synchronize(Update);
    end;

    IdHTTP1.Free;
    sleep(5000);
end;
Если получать данные с сайта через HTTPS то в мемо пустота, а если через HTTP то данные успешно появляется в мемо.

Как получить данные с сайта через HTTPS?

PS. До этого, своим "кривым" способом, который написан в первом посте, я получал данные через HTTPS.

Последний раз редактировалось bilibian; 17.02.2014 в 16:39.
bilibian вне форума Ответить с цитированием
Старый 17.02.2014, 17:32   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как получить данные с сайта через HTTPS?
у-у-у. SSL подключать. Библиотеки OpenSSL ставить. Эм... тут уже обсуждалось, и в теории давалось:
http://www.programmersforum.ru/showthread.php?t=195828
http://www.programmersforum.ru/showt...=209520&page=2
Цитата:
который написан в первом посте, я получал данные через HTTPS.
Чет не вериццо. Разве что редирект на незащищенный канал спасал, а ты думал что это HTTPS подлинный.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.02.2014, 17:41   #10
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
у-у-у. SSL подключать. Библиотеки OpenSSL ставить. Эм... тут уже обсуждалось, и в теории давалось:
http://www.programmersforum.ru/showthread.php?t=195828
http://www.programmersforum.ru/showt...=209520&page=2

Чет не вериццо. Разве что редирект на незащищенный канал спасал, а ты думал что это HTTPS подлинный.
Все это уже сделано!! библиотеки подключил. Прежде чем сюда писать я гугл раскурил. В том то и дело, что на сайт который я соединяюсь стоит редирект с http на https.

Я выяснил, что если писать не idHTTP1:=TIdHTTP.Create(nil);, а form1.idHTTP1.Create(); и idHTTP1 с IdSSLIOHandlerSocketOpenSSL1 подключать в основном потоке, то все работает. Вообще понять не могу, что за загадка. В принципе от чего ушел к тому и пришел, только ко всему этому Synchronize прикрутил, а так ничего не изменилось.

Последний раз редактировалось bilibian; 17.02.2014 в 17:49.
bilibian вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать TDownloadURL и/или зависает IdHTTP SawaMEN Общие вопросы Delphi 2 04.09.2013 17:59
при Disconnect'е Rock145 C/C++ Сетевое программирование 8 08.07.2012 22:21
Корректное выполнение Disconnect в потоках. phphel Общие вопросы Delphi 0 06.04.2012 09:31
Disconnect ClientSocket1 Alex1991 Работа с сетью в Delphi 4 09.10.2011 03:59
Массив. или FREE Pascal или MicrosoftQuick Basic. rkimnbgvf Помощь студентам 5 24.03.2010 20:57