Tôi đã xây dựng một ứng dụng giám sát trang web đơn giản bằng cách sử dụng thành phần Indy TIdhttp. Tôi muốn phát hiện khi một trang được chỉ định không được trả lại trong một khung thời gian cụ thể (tôi đang sử dụng 5000 mili giây). Như một bài kiểm tra, tôi đã tạo một trang trên một trang web cố ý mất 15 giây để trả lời. Nhưng tôi không thể có được thủ tục của tôi để "từ bỏ" sau 5 giây. Tôi đã thử ReadTimeout, một suggested solution sử dụng bộ hẹn giờ và sự kiện OnWorkBegin (không bao giờ có thể nhận được OnWorkBegin để kích hoạt ngay sau khi nhận được cuộc gọi).Có cách nào để đặt thời gian chờ phản hồi cho Indy Tidhttp không?
Lưu ý Tôi không lo lắng về thời gian chờ kết nối. Mối quan tâm của tôi ở đây là một thời gian chờ cho máy chủ trở lại với một trang.
Đây là một số mã nguồn tôi đã sử dụng. Nó chứa nhiều yếu tố tôi tham khảo.
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;
Xem thêm: [Kết nối không hết thời gian khi sử dụng Indy] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –
Logic của bạn với TTimer mong đợi TIdHTTP không đồng bộ mà không đúng –
Nhìn qua bài báo được đề xuất bởi Rob Kennedy. Tôi đã tạo ra một giải pháp kiểu luồng. Đã tạo một TStringList trong ứng dụng chính để quản lý các chủ đề của tôi. Tôi cũng có một bộ đếm thời gian bắn mỗi 5 giây. Vì vậy, nếu tôi thấy một chuỗi chưa hoàn thành trong 5 giây, tôi gọi phương thức Terminate của chuỗi. Nhưng điều này dường như không "chấm dứt" nó ngay lập tức theo cách tôi muốn; nó vẫn có vẻ chờ đợi. –