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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2014, 17:57   #11
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Код:
form1.idHTTP1.Create();
В таком вызове конструктора есть какой-то смысл только если ранее объект был уже создан явно или неявно. И то этот смысл весьма незначительный. Так что дело не в этом.
northener вне форума Ответить с цитированием
Старый 17.02.2014, 18:10   #12
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Как только я переношу эти элементы на главный поток:
Код:
IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
и переименовываю это:
Код:
idHTTP1:=TIdHTTP.Create(nil);
на
Код:
form1.idHTTP1.Create();
Все сразу начинает работать!

Если не переносить элементы, а сразу писать так:
Код:
idHTTP1.Create();
То ошибка.

У меня конечно есть подозрение, что IdHTTP1 и IdSSLIOHandlerSocketOpenSSL1 не работают вместе вне главного потока, почему то!

PS Если не закрывать прогу, а просто закрыть поток, а потом снова открыть и дать задание, то выскакивает вышеупомянутая ошибка, которая написана в первом посте!

Последний раз редактировалось bilibian; 17.02.2014 в 18:20.
bilibian вне форума Ответить с цитированием
Старый 17.02.2014, 18:43   #13
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Вот полностью код программы, где я согрешил?:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TH = class(TThread)
    html:string;
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Update;
  end;

var
  Form1: TForm1;
  L: TH;

implementation

{$R *.dfm}

procedure TH.Update;
begin
  form1.Memo1.Lines.Add(html);
end;

procedure TH.Execute;
begin

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

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

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  if button1.Tag=0 then
  begin
    button1.Tag:=1;
    button1.Caption:='STOP';
    L:=TH.Create(true);
    L.FreeOnTerminate:=true;
    L.Resume;
    L.Priority:=tpNormal;
  end
  else
  begin
    button1.Tag:=0;
    L.Terminate;
    button1.Caption:='START';
  end;
end;

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

Цитата:
где я согрешил?:
Здесь: form1.idHTTP1.Create();
Посмотри мой пример. Я создаю и освобождаю обьект в потоке. То что он у тебя как-то работал - чистая случайность, видимо потому что на форме такой компонент есть. Однако такой подход только кажется верным, на самом деле он опасный.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.02.2014, 20:24   #15
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Stilet, если делать все в одном потоке, то HTTPS получить не удается. А с помощью такого варианта, получаю HTTPS, но в качестве бонуса получаю еще и тьму ошибок.
bilibian вне форума Ответить с цитированием
Старый 17.02.2014, 21:04   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
form1.idHTTP1.Create();
Это бессмысленный код, не цепляйтесь к нему. Просто первый раз вы работаете с form1.idHTTP1 созданном на форме и со свойствами, которые в него засунули. Конструктор используется для создания экземпляра класса, а не для вызова из уже существующего. Скорее всего в данном случае он ничего и не делает. Если даже и создает что-то, то в пустоту
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.02.2014, 21:15   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

на форме SSL подцеплен при дизайне (IOHandler в Object Inspector). =>работает.
при динамическом создании его нет (IOHandler =nil) =>никаких результатов.
Цитата:
и idHTTP1 с IdSSLIOHandlerSocketOpenSSL1 подключать в основном потоке, то все работает.
это (IdSSLIOHandlerSocketOpenSSL) ТОЖЕ должно быть private полем потока. И его свойства должны быть заданы. также как свойства idHTTP включая(!) IOHandler.


form1.idHHTP1.Create(); можете смело закомментировать. работоспособность не нарушиться.
программа — запись алгоритма на языке понятном транслятору

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

Цитата:
Stilet, если делать все в одном потоке, то HTTPS получить не удается.
Ты не понимаешь... Ладно.Попробуем по другому:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, Vcl.StdCtrls, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TH = class(TThread)
    html:string;
    Lines:TStrings;
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Update;
  end;

var
  Form1: TForm1;
  L: TH;

implementation

{$R *.dfm}

procedure TH.Update;
begin
  Lines.Add(html);
end;

procedure TH.Execute;
var
    ssl: TIdSSLIOHandlerSocketOpenSSL;
begin

   with TidHTTP.Create(nil) do begin
    HandleRedirects:=true;
    Request.UserAgent:='Mozilla/5.0';
    ReadTimeout:=10000;

    ssl:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
     with ssl do begin
        MaxLineAction := maException;
        ReadTimeout := 60000 ;
        SSLOptions.Mode := sslmUnassigned;
        SSLOptions.VerifyMode := [];
        SSLOptions.VerifyDepth := 0;
     end;

     IOHandler:=ssl;
     UseTLS:=utUseRequireTLS;

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

    ssl.free;
    Free;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if button1.Tag=0 then
  begin
    button1.Tag:=1;
    button1.Caption:='STOP';
    L:=TH.Create(true);
    L.FreeOnTerminate:=true;
    L.Lines:=Memo1.Lines;
    L.Resume;
    L.Priority:=tpNormal;
  end
  else
  begin
    button1.Tag:=0;
    L.Terminate;
    button1.Caption:='START';
  end;
end;

end.
А теперь пояснения:
1) Все инкапсулируешь внутрь потока. Полностью все!. Забудь про работу с компонентами формы из-под твоего потока.

2) SSL настрой по своему. Не помню я какие точно параметры и свойства нужно определять, вот что вспомнил то написал для примера.

3) Твой поток - "черный ящик". Он должен выдать на-гора результат, но форма мало того что не должна знать как он его получит, а еще и не должна вмешиваться в это. А ты пихаешь работу с компонентом (единственным!) формы в поток. Ну и ответь теперь на вопрос - что будет если запустить несколько таких потоков.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.02.2014, 08:43   #19
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Stilet, спасибо, что помог разобраться +
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