Delphi:使用IdHttp和Thread停止下载

时间:2015-07-19 20:20:26

标签: multithreading delphi indy idhttp

我有一个线程定义THttpThread用于下载文件。如果关闭模态窗体或按下取消按钮,我想停止下载。

在下面的示例中,我得到了访问冲突,可能是因为我重用该线程的方式。

procedure Tform_update.button_downloadClick(Sender: TObject);
var
  HttpThread: THttpThread;
begin
  //download
  if button_download.Tag = 0 then
    begin
      HttpThread:= THttpThread.Create(True);
      //...
      HttpThread.Start;
    end
  //cancel download
  else
    begin
      HttpThread.StopDownload:= True;
    end;
end;

我从How stop (cancel) a download using TIdHTTP和其他许多人那里播下答案,但我仍然不知道如何更新正在运行的线程的属性。

1 个答案:

答案 0 :(得分:1)

我将使用用户评论中的提示给出答案。

访问冲突来自于取消期间未分配HttpThread的事实。必须在其形式下定义HttpThread: THttpThread的原因如下:

Tform_update = class(TForm)
//...
private
  HttpThread: THttpThread;

然后代码应该是:

procedure Tform_update.button_downloadClick(Sender: TObject);
begin
  //download
  if button_download.Tag = 0 then
    begin
      HttpThread:= THttpThread.Create(True);
      //...
      HttpThread.Start
    end
  //cancel download
  else
    begin
      if Assigned(HttpThread) then HttpThread.StopDownload:= True;
    end;
end;

表单关闭相同

procedure Tform_update.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(HttpThread) then HttpThread.StopDownload:= True;
end;

正如一些用户在一些评论中所要求的那样,不需要线程代码。