2011-08-03 10 views

答えて

9

を既定の手順idhttp1.Disconnectを使用することができ、私はTIdHTTP.OnWorkイベントでAbort方法を使用してサイレント例外をスローし、それをキャンセルしようとするだろう。このイベントは読み取り/書き込み操作のために起動されるため、ダウンロードの進行中にも起動されます。

type 
    TDownloadThread = class(TThread) 
    private 
    FIdHTTP: TIdHTTP; 
    FCancel: boolean; 
    procedure OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode; 
     AWorkCount: Integer); 
    public 
    constructor Create(CreateSuspended: Boolean); 
    property Cancel: boolean read FCancel write FCancel; 
    end; 

constructor TDownloadThread.Create(CreateSuspended: Boolean); 
begin 
    inherited Create(CreateSuspended); 
    FIdHTTP := TIdHTTP.Create(nil); 
    FIdHTTP.OnWork := OnWorkHandler; 
end; 

procedure TDownloadThread.OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode; 
    AWorkCount: Integer); 
begin 
    if FCancel then 
    begin 
    FCancel := False; 
    Abort; 
    end; 
end; 

またはそれはあなたが同じイベントにDisconnect方法を使用することができ、直接切断のために、ここで言及したように。

procedure TDownloadThread.OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode; 
    AWorkCount: Integer); 
begin 
    if FCancel then 
    begin 
    FCancel := False; 
    FIdHTTP.Disconnect; 
    end; 
end; 
+0

'OnWorkHandler'イベントの内部から' FIdHTTP.Disconnect'を呼び出す方がいいですか? – Salvador

+0

@サルバドール - もしあなたがもうFIdHTTPからの接続を維持しない場合に備えて、確かにそうなります。重要なのは[OnWork](http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdTCPConnection_OnWork.html)イベントで実行して、進行中にダウンロードを中断することです。 –

+1

途中でリクエストを中止することはできず、接続を開いたままにしておくことはできません。ソケットを退出する状態や、すでに送信されたデータはわかりません。 HTTP接続をクリアして、新しいリクエストに対してオープンしたままにする方法はありません。ただのやり方は、接続を閉じることです。 –

関連する問題