0

我定义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 and some many others中播下了答案,但我仍然不知道如何更新正在运行的线程的属性。

4

1 回答 1

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;

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

于 2015-07-20T07:55:14.607 回答