我在尝试使用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;
答案 0 :(得分:0)
不要这样做,因为TDownloadUrl无法正常工作。如果您要基于TDownloadUrl类创建2个或更多对象并同时下载它们将不会返回结果,则每个线程将保持冻结状态。即使您在碰撞发生后将释放对象(我将它们从主线程中释放出来),系统也需要5分钟才能解决它,但即使在所有对象都被释放后,其他所有对象都会被创建“受到伤害“(意思是他们会立即冻结)。
Here是Delphi-7的单位,如果有人想查看我的陈述,可以用来重现这种情况。