我在做一个有关下载的东西时,如何才能取消,暂停与继续下载线程?type
  TMyDownLoad=class(TThread)
  public
    sName:string;
    procedure Execute;override;
    procedure Download;
    procedure  MsgWrong;
    procedure  MsgSuccess;
  end;procedure TMyDownLoad.Download;
var
  UnitName,PathName:String;
  MyStream:TMemoryStream;
  IDHTTP: TIDHttp;
begin
  sName:=fmMain.eName.Text;
  IDHTTP:= TIDHTTP.Create(nil);
  MyStream:=TMemoryStream.Create;
  try
    IdHTTP.Get(fmMain.eUrl.Text,MyStream);
    except
      Synchronize(MsgWrong);
      MyStream.Free;
      Exit;
    end;
    Synchronize(MsgSuccess);
    MyStream.SaveToFile(fmMain.ePath.Text+fmMain.eName.Text);
    MyStream.Free;
end;procedure TMyDownLoad.Execute;
begin
  inherited;
  Download;
end;procedure TMyDownload.MsgWrong;
begin
  showmessage('下载出错!');
end;procedure TMyDownload.MsgSuccess;
begin
  showmessage(sName+'下载完成!');
end;procedure TfmMain.btnDownloadClick(Sender: TObject);
begin
  TMyDownLoad.Create(false);
end;

解决方案 »

  1.   

    别用匿名变量TMyDownLoad.Create(false);
    用全局的命名变量,如
    var
      T1: TMyDownLoad;T1 := TMyDownLoad.Create(false);T1.Resume;//恢复
    T1.Suspend;//暂停
    T1.Free;//销毁
      

  2.   

    那么,如果我有一个数组T: array[1..1000] of TMyDownLoad;
    当T[2]下载完成后,并且T[2].Free;
    能否这样赋值:
    T[2]:=T[3];
      

  3.   

    楼上说的没法做到,现在的问题不是停线程,而是停下载哈。据说所知是一个连接之内是没法暂停的,只能中断,如果断点续传还差不多。在TIdHttp的onWork事件里写代码判断关闭条件,来关闭TidHttp,可以中断下载。
      

  4.   

    在这种操作中还有个问题:我有一个数组T: array[1..1000] of TMyDownLoad;
    当T[2]下载完成后,并且T[2].Free;
    执行这样的操作:T[2]:=T[3];
    就要报错
    我想的是用链表解决,有没有更好的办法?
      

  5.   

    我在中断函数中如是写:
    procedure TfmMain.btndeleteClick(Sender: TObject);
    var
      iCX1:integer;
    begin
      if (fmMain.listTask.ItemIndex>-1)
      then begin
        fmMain.bStop:=true;
        fmMain.aTasks[fmMain.listTask.ItemIndex+1]^.IDHttp.Free;
        fmMain.aTasks[fmMain.listTask.ItemIndex+1]^.Free;
        //dispose(fmMain.aTasks[fmMain.listTask.ItemIndex+1]);
        for iCX1:=fmMain.listTask.ItemIndex+2 to fmMain.iTasks do
        begin
          fmMain.aTasks[iCX1-1]:=fmMain.aTasks[iCX1];
          dec(fmMain.aTasks[iCX1-1].iIndex);
        end;
        fmMain.aTasks[fmMain.iTasks]:=nil;
        dec(fmMain.iTasks);
      end
      else showmessage('未选择任务!');
    end;
    可以中断,但是要报错,why?