“下载URL时出错:”在TThread.Execute中使用TDownloadUrl

时间:2011-10-21 15:08:37

标签: multithreading delphi download

我在尝试使用TThread下载带有14mb的文件时遇到了一些问题。 当我将下载代码放入TDataModule时,下载是可以的,但是在重构并将代码移动到TThread.Execute后,在DownloadUrl.ExecuteTarget上我收到了标题上的错误消息。

TThread中的代码:

procedure TThreadDownload.Execute;
var
    DownloadFile: TDownloadUrl;
begin
try
    DownloadFile := TDownLoadURL.Create(nil);
    DownloadFile.URL := 'http://.....';
    DownloadFile.Filename := 'c:\';
    DownloadFile.OnDownloadProgress := URL_OnDownloadProgress; //Procedure created to     update the progressbar.
    DownloadFile.ExecuteTarget(nil);
    DownloadFile.Free;
except
    on E: Exception do
    begin
      MessageDlg('Error'+#13+#10+E.Message,
        mtInformation, [mbOK], 0);
    end;
end;

端;

对于什么是错误的任何想法?

感谢。

我解决了这个问题:

在阅读了DownloadUrl的代码后,我对代码进行了一些修改,现在它工作正常。

代码确定:

procedure TThreadDownload.AtualizarTela;
begin
    with _Form do
    begin
        TcxProgressBar(_Form.FindComponent(_ProgressBar.Name)).Properties.Max :=     _TotalDownload;
        TcxProgressBar(_Form.FindComponent(_ProgressBar.Name)).Position := _StatusDownload;
    end;
end;

constructor TThreadDownload.Create(CreateSuspended: Boolean; AForm: TFrmMyFormWithProgress; AProgress: TcxProgressBar; PathUrl, PathLocal: String);
begin
    inherited Create(CreateSuspended);
    _Form := AForm;
    _ProgressBar := AProgress;
    _PathUrl := PathUrl;
    _PathLocal := PathLocal;
    FreeOnTerminate := True;
end;

procedure TThreadDownload.Execute;
var
    DownloadFile: TDownloadUrl;
begin
    try
        DownloadFile := TDownloadUrl.Create(nil);
        DownloadFile.URL := _PathUrl;
        DownloadFile.Filename := _PathLocal;
        DownloadFile.OnDownloadProgress := URL_OnDownloadProgress;
        DownloadFile.ExecuteTarget(_Form);
        DownloadFile.Free;
    except
        on E: Exception do
        begin
            MessageDlg('Error Message'+#13+#10+E.Message, mtInformation, [mbOK], 0);
        end;
    end;
end;

procedure TThreadDownload.URL_OnDownloadProgress(Sender: TDownLoadURL; Progress,
ProgressMax: Cardinal; StatusCode: TURLDownloadStatus; StatusText: String;
  var Cancel: Boolean);
begin
    _TotalDownload := ProgressMax;
    _StatusDownload := Progress;
    Synchronize(AtualizarTela);
end;

1 个答案:

答案 0 :(得分:0)

不要这样做,因为TDownloadUrl无法正常工作。如果您要基于TDownloadUrl类创建2个或更多对象并同时下载它们将不会返回结果,则每个线程将保持冻结状态。即使您在碰撞发生后将释放对象(我将它们从主线程中释放出来),系统也需要5分钟才能解决它,但即使在所有对象都被释放后,其他所有对象都会被创建“受到伤害“(意思是他们会立即冻结)。

Here是Delphi-7的单位,如果有人想查看我的陈述,可以用来重现这种情况。