Здравствуйте, написал программу, воде бы работает, но иногда зависает при Get запросе к некоторым сайтам, один из таких сайтов http://www.sura-expert.ru/ Пробовал просто сделать Get запрос к этой странице и вывести исходный код в Label, но всеравно зависает, в чем может быть причина и как это можно исправить ? Или вот еще на этой ссылке www.bgct.ru зависает.
IdAntiFreeze использую, без него прога зависала сразу, но работала, но опять же то этих сайтов, когда добавил этот компонент, программа сразу перестала зависать, но когда доходит до этих сайтов - зависает. с этим к сожалению не знаком, сейчас буду гуглить, спасибо.
Ставил и ConnectTimeout и ReadTimeout по 10 секунд, не помогло, да и сайты вроде с бразера быстро загружаются.
Смотри заголовки, параметры запроса и тд... З.Ы. по истечению времени обычный try except не определит. Нужно обрабатывать так: PHP: begin http.ConnectTimeout := 1; http.ReadTimeout := 1; try Memo1.Lines.Text := http.Get('http://ya.ru'); except on EIdConnectTimeout do ShowMessage('fuck'); on EIdReadTimeout do ShowMessage('fuck'); end; end; Попробуй обновить либу инди на более новую. Только в последних нужно писать: HTTP.IOHandler.ReadTimeout HTTP.IOHandler.ConnectTimeout
Ну вот мой весь код: Code: procedure TForm2.Button2Click(Sender: TObject); begin f:=TStringList.Create(); f.LoadFromFile('base.txt'); n:=f.count; s:=n; Label1.Caption:=inttostr(s); f1:=Tstringlist.Create(); f1.LoadFromFile('good.txt'); f2:=Tstringlist.Create(); f2.LoadFromFile('nogood.txt'); IdHTTP1.HandleRedirects:=True; for i:= 0 to n-1 do begin idhttp1.connecttimeout:=10000; idhttp1.readtimeout:=10000; try IdHTTP1.Get(f.Strings[i]); f2.Add(d); f2.SaveToFile('nogood.txt'); except f1.Add(d); f1.SaveToFile('good.txt'); end; s:=s-1; Label1.Caption:=inttostr(s); end; end; procedure TForm2.IdHTTP1Redirect(Sender: TObject; var dest: string; var NumRedirect: Integer; var Handled: Boolean; var VMethod: string); begin d:=IdHTTP1.Response.Location; end; shadowrun, спасибо, сейчас попробую.
Code: AIdHTTP.OnWork := AIdHTTPWork; //... procedure AIdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin Application.ProcessMessages; end;
ADR-007, компилятор ругается на строку: IdHTTP.OnWork := AIdHTTPWork; E2009 Incompatible types: 'method pointer and regular procedure'
Процедура AIdHTTPWork должна быть методом класса. Объяви ее в public пространстве своей формы, например.
А объявление процедуры с Code: procedure AIdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); на Code: procedure TForm2.AIdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); заменил?
Chrome~, сейчас заменил, программа запустилась, но все равно зависает на этих сайтах. Ничего не помогает.
Code: TIdHTTPRedirectHelper = class helper for TIdHTTP function GetWithRedirect(URL: string; MaxRedirectCount: Integer = 10): string; procedure HeadWithRedirect(URL: string; MaxRedirectCount: Integer = 10); end; { TIdHTTPRedirectHelper } function TIdHTTPRedirectHelper.GetWithRedirect(URL: string; MaxRedirectCount: Integer): string; var I: Integer; begin for I := 0 to MaxRedirectCount do try Result := Get(URL); Exit; except on E : EIDHttpProtocolException do if ((E.ErrorCode = 301) or (E.ErrorCode = 302)) and (I < MaxRedirectCount) then URL := Response.Location else raise; end; URL := Response.Location; end; procedure TIdHTTPRedirectHelper.HeadWithRedirect(URL: string; MaxRedirectCount: Integer); var I: Integer; begin for I := 0 to MaxRedirectCount -1 do try Head(URL); Exit; except on E : EIDHttpProtocolException do if (E.ErrorCode = 301) or (E.ErrorCode = 302) and (I < MaxRedirectCount) then URL := Response.Location else raise; end; URL := Response.Location; end; думаю ясно как переделать...
Мой совет дочитать книгу до конца... а затем уже браться за работу с HTTP протоколом. Вот я накидал примерчик Вам, комментил почти каждую строчку кода. Разбирайтесь. Удачи. Пароль: antichat Ссылка: _http://files.mail.ru/BZ0MW9 P.S. По поводу редиректа. Code: http.handleredirect := false; try http.get(url); except // Копируем из HTTP.Response.RawHeaders.Text строку Location... end