Delphi, IdHTTP, Get запрос каждые [хх] секунд.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by rapira37, 20 Sep 2012.

  1. rapira37

    rapira37 New Member

    Joined:
    30 Jul 2012
    Messages:
    21
    Likes Received:
    0
    Reputations:
    -1
    ////
     
    #1 rapira37, 20 Sep 2012
    Last edited: 14 Oct 2012
  2. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    для решения поставленной задачи существуют такие штуки как потоки
     
  3. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    TTimer не? А чтоб прога не висла юзай в теле цикла Application.ProcessMessages...
    Ну и исключения не забывай, и что-то типа IdHttp.Disconnect...
     
  4. rapira37

    rapira37 New Member

    Joined:
    30 Jul 2012
    Messages:
    21
    Likes Received:
    0
    Reputations:
    -1
    ////
     
    #4 rapira37, 20 Sep 2012
    Last edited: 14 Oct 2012
  5. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Код в студию...
    Зы, юзал "GsvThread".
    От души приводил :cool:
    https://forum.antichat.ru/thread349095.html
     
  6. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    юзай стандартный класс TThread. примеров на просторах интернета навалом (1-я ссылка из гугла тЫц). а чтоб поток не завершался сам по себе, необходимо ловить все исключительные ситуации (try except).
     
  7. rapira37

    rapira37 New Member

    Joined:
    30 Jul 2012
    Messages:
    21
    Likes Received:
    0
    Reputations:
    -1
    ////
     
    #7 rapira37, 20 Sep 2012
    Last edited: 14 Oct 2012
  8. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    можешь ничего не писать, либо вывести в лог ошибку. код идущий между except end; будет выполнятся в случае ошибки (когда вываливается исключение), то есть там необходимо проводить обработку исключения (вывод ошибки или, как писал выше, запись в лог).
     
  9. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    по идеи ничего, если в except произойдёт искл. то поток должен продолжить работу. а код там реально простой как два рубля...

    Создаём класс потока: TThreadEnter
    Code:
    unit ThreadEnterUnit;
    
    interface
    
    uses
      Classes, Windows, SysUtils, IdHTTP;
    
    type
      TThreadEnter = class(TThread)
      class var WorkOn : Boolean;
      class var Stop : Boolean;
      class var TimeGet : Integer;
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;
    
    implementation
    
    uses Unit1;
    
    { TThreadEnter }
    
    procedure TThreadEnter.Execute;
    var
      HTTP : TIdHTTP;
    begin
      (* Создаём объект HTTP *)
      HTTP := TIdHTTP.Create(nil);
      (* Настройка HTTP *)
      HTTP.AllowCookies := True;
      HTTP.HandleRedirects := True;
      (* Заголовки HTTP *)
      HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1'{USER_AGENTS[Random(21)]};
      HTTP.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
      HTTP.Request.AcceptLanguage := 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
      HTTP.Request.CharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
      HTTP.Request.Connection := 'keep-alive';
      try
        (* Крутит поток пока не умрёт *)
        while (not Stop) do
          begin
            (* Заходим по ссылке *)
            try
              HTTP.Get('http://yandex.ru');
            except
    
            end;
            (* Обяъвлем на форму о работе *)
            Synchronize(procedure
                          begin
                            Form1.Memo1.Lines.Append('[' + TimeToStr(Now)+ ']: ' + 'Успешно зашли на страницу!!!');
                          end);
            if TimeGet > 0 then
              Sleep(TimeGet);
          end;
      finally
        (* Чистим за собой HTTP *)
        FreeAndNil(HTTP);
      end;
    end;
    
    end.
    

    На форму кидаем Memo1 и имя формы должно быть Form1 две кнопки и всё:
    Code:
      private
        { Private declarations }
        procedure EndThreadGetTIME(Sender: TObject);
      public
    
    implementation
    
    uses ThreadEnterUnit;
    
    
    (* Кнопка START *)
    procedure TForm1.ButtonStartClick(Sender: TObject);
    begin
      if TThreadEnter.WorkOn then
        Exit;
      TThreadEnter.WorkOn := True;
      TThreadEnter.Stop := False;
      TThreadEnter.TimeGet := 10000; // 10  секунд
      with TThreadEnter.Create(True) do
        begin
          FreeOnTerminate := True;
          Priority := tpLowest;
          OnTerminate := Self.EndThreadGetTIME;
          Resume;
        end;
    end;
    
    (* Кнопка STOP *)
    procedure TForm1.ButtonStopClick(Sender: TObject);
    begin
      if TThreadEnter.WorkOn then
        begin
          TThreadEnter.Stop := True;
        end;
    end;
    
    (* Сообщение о завершение работы *)
    procedure TForm1.EndThreadGetTIME(Sender: TObject);
    begin
      TThreadEnter.WorkOn := False;
      TThreadEnter.Stop := True;
      Memo1.Lines.Append('Поток завершил работу.');
    end;
    
     
  10. rapira37

    rapira37 New Member

    Joined:
    30 Jul 2012
    Messages:
    21
    Likes Received:
    0
    Reputations:
    -1
    ////
     
    #10 rapira37, 20 Sep 2012
    Last edited: 14 Oct 2012
  11. rapira37

    rapira37 New Member

    Joined:
    30 Jul 2012
    Messages:
    21
    Likes Received:
    0
    Reputations:
    -1
    ////
     
    #11 rapira37, 21 Sep 2012
    Last edited: 14 Oct 2012
  12. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    ссылку в студию, если не хочешь палить, тогда идём в яшку \ гуглик и там пишет - "Delphi отладка" читаем пару статей, разбираемся. Идём в код ставим бряк гуляем вместе с кодом.... находим ошибку. Решаем проблему и всё) Вообще советую книжечку прочитать и будет счастье) там и потоки и отладка и работа с сетью всё, что нужно на начинающих и не только). :)


    Мoжно еще в EndThread.....

    в конце кода поставить запуск потока ButtonSTART.Click; Как то так) будет бессмертный как Чак Норис :D
     
    #12 Kandi, 21 Sep 2012
    Last edited: 21 Sep 2012
  13. rapira37

    rapira37 New Member

    Joined:
    30 Jul 2012
    Messages:
    21
    Likes Received:
    0
    Reputations:
    -1
    ////
     
    #13 rapira37, 21 Sep 2012
    Last edited: 14 Oct 2012
  14. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    проверь логику процедур, выделение и освобождение ресурсов, корректность выполнения предшествующих запросов, для удобства можно логирование при отладке добавить с помощью директив компилятора:
    Code:
    {$DEFINE TEST}
    ............
    {$IFDEF TEST}OutputDebugString(PChar(Format('%s',['info...'])));{$ENDIF}
    при этом в even log (ctrl+alt+v) будет выводиться твоя инфа, в общем дебаж