Я создал простое приложение мониторинга веб-сайта с помощью Инди компонент TIdhttp. Я хочу обнаружить, когда обозначенная страница не возвращается в кадре требуемого времени (я использую 5 000 миллисекунд). Как тест я создал страницу на веб-сайте, который намеренно занимает 15 секунд для ответа. Но я не могу заставить свою процедуру "сдаваться" после этих 5 секунд. Я попробовал ReadTimeout, предложенное решение с помощью таймера и события OnWorkBegin (так и не смог заставить OnWorkBegin сразу стрелять после получить вызова).
Обратите внимание, что я не волнуюсь по поводу тайм-аута соединения. Мое беспокойство здесь является тайм-аутом для сервера для возврата со страницей.
Вот некоторый исходный код, который я использовал. Это содержит многие элементы, на которые я ссылаюсь.
procedure TServLogic.WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
GetTimer.Enabled := True;
end;
procedure TServLogic.WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
GetTimer.Enabled := False;
end;
procedure TServLogic.GetTimerTimer(Sender: TObject);
begin
idHttp.Disconnect(True);
end;
procedure TServLogic.CallHttp(mlink: String): String;
begin
result := '';
GetTimer := TTimer.create(nil);
GetTimer.OnTimer := GetTimerTimer;
GetTimer.Interval := 5000;
try
IdHTTP := TIdHTTP.create(nil);
idhttp.ReadTimeout := 5000;
IdHttp.OnWorkBegin := WorkBegin;
IdHttp.OnWorkEnd := WorkEnd;
try
result := idhttp.get(mLink);
except
on e:exception do begin
AppendToLog('Server did not respond withing 5 seconds');
end;
end;
finally
GetTimer.Free;
idhttp.free;
end;
end;
В конце концов я получил ответ, основанный на комментариях Роба Кеннеди. Я много раз пытался связаться с ним и попросить его дать «официальный» ответ, чтобы я мог дать ему голос. Никогда не слышал ответа.