b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Delphi里实现多线程下载文件以及显示进度到界面

电脑杂谈  发布时间:2020-01-23 05:01:46  来源:网络整理

delphi 多线程下载文件_delphi http下载文件_delphi idhttp 下载文件

2018-08-03delphi_笔...

开发的过程中遇到文件下载的过程,我们都是想到要放到线程里处理,那么线程里进行文件下载,进度如何展示呢?这针对众多不频繁使用线程的人来说是个问题,尤其是把进度通知到界面上这一步,所以此处分享一个简单的事例。使用indy里的TIdHttp控件来下载文件delphi 多线程下载文件delphi 多线程下载文件,然后借助windows自定义消息将进度反馈至界面上。具体下载线程代码如下:

Pascal

unit uDownThread;

interface

Classes, Windows, SysUtils, IdHTTP, IdComponent, Math, Messages;

const

WM_DownProgres = WM_USER + 1001;

TDownThread = class(TThread)

private

FIDHttp: TIdHTTP;

FWorkSize: Int64;

FURL: string;

FSavePath: string;

FHandle: THandle;

{ Private declarations }

procedure DoExecute;

delphi http下载文件_delphi 多线程下载文件_delphi idhttp 下载文件

procedure DoWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);

procedure DoWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);

protected

procedure Execute; override;

public

constructor Create(const AURL, ASavePath: string; const AHandle: THandle);

destructor Destroy; override;

end;

implementation

{ TDownThread }

constructor TDownThread.Create(const AURL, ASavePath: string; const AHandle: THandle);

begin

FURL := AURL;

FSavePath := ASavePath;

FHandle := AHandle;

FIDHttp := TIdHTTP.Create(nil);

FIDHttp.OnWorkBegin := DoWorkBegin;

FIDHttp.OnWork := DoWork;

inherited Create(True);

destructor TDownThread.Destroy;

begin

FIDHttp.Free;

delphi 多线程下载文件_delphi idhttp 下载文件_delphi http下载文件

inherited;

procedure TDownThread.DoExecute;

FMs: TMemoryStream;

begin

FMs := TMemoryStream.Create;

try

FIDHttp.Get(FURL, FMs);

FMs.SaveToFile(FSavePath);

except

// 记录日志

// 处理重试

end;

finally

FMs.Free;

end;

procedure TDownThread.DoWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);

ANowProgres: Integer;

begin

if FWorkSize <> 0 then

begin

ANowProgres := Ceil(AWorkCount / FWorkSize * 100);

PostMessage(FHandle, WM_DownProgres, 0, ANowProgres);

delphi 多线程下载文件_delphi idhttp 下载文件_delphi http下载文件

end;

procedure TDownThread.DoWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);

begin

FWorkSize := AWorkCountMax;

procedure TDownThread.Execute;

begin

DoExecute;

调用方法为:

Pascal

unit Unit8;

interface

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, uDownThread;

TForm8 = class(TForm)

Button1: TButton;

ProgressBar1: TProgressBar;

Edit1: TEdit;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

FDownThread: TDownThread;

procedure DoWM_DownProgres(var Msg: TMessage); message WM_DownProgres;

delphi idhttp 下载文件_delphi 多线程下载文件_delphi http下载文件

{ Private declarations }

public

{ Public declarations }

end;

Form8: TForm8;

implementation

{$R *.dfm}

procedure TForm8.Button1Click(Sender: TObject);

begin

if not Assigned(FDownThread) then

begin

FDownThread := TDownThread.Create(Edit1.Text, 'd:\Tim.exe', Handle);

FDownThread.Start;

end;

procedure TForm8.DoWM_DownProgres(var Msg: TMessage);

begin

ProgressBar1.Position := Msg.LParam;

procedure TForm8.FormCreate(Sender: TObject);

begin

if Assigned(FDownThread) then

begin

FDownThread.Terminate;

FDownThread.WaitFor;

FDownThread.Free;

FDownThread := nil;

end;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-137872-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 李约
        李约

        把一切问题都理解为经济问题

      • 朱攀
        朱攀

        当然凭他的数学水平也确实管不了

      热点图片
      拼命载入中...