以下是具体的代码实现,请高手看看有没有需要改进的地方。谢谢!procedure TDownload.Execute;
var
  idHTTP : TIdHTTP;
  isExcetpion:Boolean;
  urlindex:integer;
  url1:string;
begin
  urlindex:=aManager.ThisJob.iUrlIndex;
  iLeft := aManager.arDLFThread[iIndex].iOffsetEnd - iThisBegin;
  aManager.arThisDownloadSize[iIndex] := 0;
    Repeat
     begin
        isExcetpion:= true;
        idHTTP := TidHTTP.Create(nil);
        try
          iThisBegin := aManager.arDLFThread[iIndex].iOffsetBegin + aManager.arDLFThread[iIndex].iOffsetDownload;
          idHTTP.HandleRedirects := True;
          idHTTP.ReadTimeout := 30000;
          idHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)';  
          idHTTP.Request.Connection:='Keep-Alive';
          idHTTP.Request.ContentRangeStart := iThisBegin;
          idHTTP.Request.ContentRangeEnd := aManager.arDLFThread[iIndex].iOffsetEnd;
          url1:=aManager.thisJob.iUrls[urlindex];
          idHTTP.DoRequest(hmGet, url1, nil, nil);
          while not aManager.arStop[iIndex] and (iLeft > 0) do
            if iLeft > BufferSize then
            begin
              idHTTP.ReadBuffer(Buffer, BufferSize);
              fs.WriteBuffer(Buffer, BufferSize);
              aManager.arDLFThread[iIndex].iOffsetDownload := aManager.arDLFThread[iIndex].iOffsetDownload + BufferSize;
              aManager.arThisDownloadSize[iIndex] := aManager.arThisDownloadSize[iIndex] + BufferSize;
              iLeft := iLeft - BufferSize;
              aManager.arDLFThread[iIndex].iState := 1;
            end
          else
            begin
              idHTTP.ReadBuffer(Buffer, iLeft);
              fs.WriteBuffer(Buffer, iLeft);
              aManager.arDLFThread[iIndex].iOffsetDownload := aManager.arDLFThread[iIndex].iOffsetDownload + iLeft;
              aManager.arThisDownloadSize[iIndex] := aManager.arThisDownloadSize[iIndex] + iLeft;
              iLeft := 0;
              aManager.arDLFThread[iIndex].iState := 1;
            end;
            isExcetpion := true;
          except
            isExcetpion := false;
            if urlindex<aManager.ThisJob.iurlsCount-1 then
            begin
              urlindex:=urlindex+1;
            end
            else
            begin
              urlindex:=0;
              aManager.arDLFThread[iIndex].iState := 2;
            end;
          end;
        idHTTP.Free;
      end;
    until isExcetpion;
    fs.Free;
    aManager.arStop[iIndex] := False;
    aManager.arStoped[iIndex] := True;
    aManager.arDLFThread[iIndex].iState := 1;
  end;