2016-07-31 3 views
1

Я написал простую программу, которая периодически проверяет данные. Проблема в том, что процесс проверки замедляется с течением времени. Сначала он отправляет 2 сообщения за одну секунду, после того как как 45 секунд он отправляет одно сообщение, в конечном итоге он полностью останавливается. Я не знаю, что здесь не так.Как анализировать ответ HTTP Post быстрее

procedure TForm2.CheckURLs; 
var 
    lHTTP: TIdHTTP; 
    IdSSL : TIdSSLIOHandlerSocketOpenSSL; 
    N: Integer; 
    Access: string; 
    Params, Reply: TStringList; 
    Cookie: TIdCookie; 
begin 
    lHTTP := TIdHTTP.Create(nil); 
    try 
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP); 
    IdSSL.SSLOptions.Method := sslvTLSv1; 
    IdSSL.SSLOptions.Mode := sslmClient; 
    lHTTP.IOHandler := IdSSL; 
    lHTTP.ReadTimeout := 30000; 
    lHTTP.HandleRedirects := True; 
    lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'; 
    lHTTP.Get('https://www.mywebserver.com', TStream(nil)); 
    Cookie := lHTTP.CookieManager.CookieCollection.Cookie['id', 'www.mywebserver.com']; 
    if Cookie <> nil then 
     Access := Cookie.Value; 
    finally 
    end; 

    Params := TStringList.Create; 
    Reply := TStringList.Create; 

    TTask.Create(
    procedure 
    var 
     N, m, i : integer; 
    begin 
     Params.Add('IDs=' +B.Strings[i]); 
     try 
     lHTTP.Request.CustomHeaders.Values['id'] := Access; 
     lHTTP.Request.CustomHeaders.Values['X-Requested-With'] := 'XMLHttpRequest'; 
     lHTTP.Request.Referer := 'https://www.mywebserver.com/'; 
     lHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; 
     lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36'; 
     lHTTP.ConnectTimeout := 0; 
     Reply.Text := lHTTP.Post('https://www.mywebserver.com/', Params); 

     if AnsiContainsStr(Reply.Text, 'nothing') then 
     begin 
      TThread.Synchronize(nil, 
      procedure 
      begin 
       Memo1.Lines.Add(B.Strings[i]); 
       Label2.Caption := Memo1.Lines.Count.ToString; 
      end 
     ); 
     end;   
     finally 
     Reply.Clear; 
     end; 
    end 
).Start; 
end; 

ответ

2

В дополнение к тому, что техницвета сказал, TTask в Delphi 10.1 Берлин имеет проблемы синхронизации, такие как:

RSP-15233: TTask Stuck and take a very very long time to start

RSP-12557: TTask serialize parallel tasks without apparent reason

Чтобы избежать этих проблем , попробуйте использовать TThread.CreateAnonymousThread() вместо TTask.

+0

Я тестировал RSP-15233 и, конечно же, только около 9 задач. После некоторого тестирования я считаю, что происходит то, что задача отправляется в основной поток, а вызов сна останавливает остальное от запуска, по крайней мере, на некоторое время. Добавление SyncObject решено для меня: x: = 0; для I: = 1 до 25 делать TTask.Create (процедура начинают OutputDebugString (PChar ('Начало ::' + TInterlocked.Increment (х) .ToString)); сна (MaxInt); конец) .start; – FredS

+0

использовал AnonymousThreads, не более медлительный. –

0

Ваша медлительность может исходить из этих двух частей вашей программы: Выгрузки ДАННЫЕ или работать на них.

По опыту, я подозреваю, что сайт замедляет вас, поэтому вы можете попробовать прокомментировать все (внимательно, конечно) после процедуры загрузки. Запуск этой программы снова должен дать тот же результат, а затем дать нам подтверждение на сайте «ошибка».

Чтобы избежать блокировки в течение 45 секунд, вызванной защитой от роботов, постарайтесь предотвратить медленную работу программы, добавив несколько секунд паузы после каждого запроса. Даже без защиты, это хорошая практика, чтобы немного замедлить наши веб-сайты. Мы не делаем DoS :)

 Смежные вопросы

  • Нет связанных вопросов^_^