2010-07-23 42 views
7

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; 
+0

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). –

+2

Logic của bạn với TTimer mong đợi TIdHTTP không đồng bộ mà không đúng –

+0

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. –

Trả lời

2

Tôi cuối cùng đã nhận được câu trả lời dựa trên nhận xét của Rob Kennedy. Tôi đã cố gắng nhiều lần để liên lạc với anh ta và yêu cầu anh ta trả lời "chính thức" để tôi có thể cho anh ta phiếu bầu. Chưa bao giờ nghe lại.

Các vấn đề liên quan