delphi 发送下载进度到前台的多线程下载

unit uTestThread;

interface

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

const
  WM_DownProgres = WM_USER + 1001;

type
  TTestThread = class(TThread)
  private
    FIDHttp: TIdHTTP;                   //封装的idhttp实例
    FMaxProgres: Int64;
    FURL: string;
    FSavePath: string;
    FHandle: THandle;
    { Private declarations }
    procedure DoExecute;
    procedure DoWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    procedure DoWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
  protected
    procedure Execute; override;
  public
    constructor Create(AURL, ASavePath: string; AHandle: THandle);
    destructor Destroy; override;
  end;

implementation

{ TestThread }

constructor TTestThread.Create(AURL, ASavePath: string; AHandle: THandle);
  begin
    FURL := AURL;
    FSavePath := ASavePath;
    FHandle := AHandle;
    FIDHttp := TIdHTTP.Create(nil);
    FIDHttp.OnWorkBegin := DoWorkBegin;
    FIDHttp.OnWork := DoWork;
    inherited Create(False); // 参数为False指线程创建后自动运行,为True则不自动运行
    FreeOnTerminate := True; // 执行完毕后自动释放
  end;

destructor TTestThread.Destroy;
  begin
    FIDHttp.Free;
    inherited;
  end;

procedure TTestThread.DoExecute;
  var
    FMs: TMemoryStream;
  begin
    FMs := TMemoryStream.Create;
    try
      FIDHttp.Get(FURL, FMs);
      FMs.SaveToFile(FSavePath);
    finally
      FMs.Free;
    end;
  end;

procedure TTestThread.DoWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
  var
    ANowProgres: Integer;
  begin
    if FMaxProgres <> 0 then
    begin
      ANowProgres := Ceil(AWorkCount / FMaxProgres * 100);
      PostMessage(FHandle, WM_DownProgres, 0, ANowProgres);
    end;
  end;

procedure TTestThread.DoWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
  begin
    FMaxProgres := AWorkCountMax;
  end;

procedure TTestThread.Execute;
  begin
    DoExecute;
  end;

end.

 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
  var
    FDownThread: TTestThread;
  begin
    FDownThread := TTestThread.Create(Edit1.Text, 'c:\testdown..zip',
      Self.Handle);
  end;

procedure TForm1.DoWM_DownProgres(var Msg: TMessage);
  begin
    Gauge1.Progress := Msg.LParam;
  end;

转载于:https://www.cnblogs.com/11wf/archive/2012/12/02/2798292.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi线程池实现多线程FTP分段下载组件 by :renshouren mail:114032666@qq.com QQ:114032666 2019.10.05 使用的组件 1、TIdFTP Indy FTP客户端 2、TThreadsPool 线程池 工作原理及流程 调用本单元,将自动在程序初始化时生成线程池TThreadPoolDown实例 Share_ThreadPool_FTPDown 一、外部调用方法 外部只需要一次性调用 FtpDown() 函数向线程池加入下载任务,下载任务执行中的事件会通过调用时注册的 回调函数 AFtpDownEvent 进行通知。 二、内部工作流程 1、FtpDown()函数将调用TThreadPoolDown.AddFtpDown() ,然后调用TADownFileObj.MakeGetFileSizeObj()分配线程任务 本过程中,将向回调函数 AFtpDownEvent 触发 HEM_ADDURL 事件通知 2、工作线程调用任务对象TFTPHeadObj.DoThreadExecute 过程获取远程文件大小 备注:该功能实际使用到FTP命令SIZE,该命令一些老版本FTP服务器有可能不支持 本过程中,若获取文件大小成功,将向回调函数 AFtpDownEvent 触发 HEM_GETSIZE 事件通知, 若失败,则触发 HEM_ERROR 事件通知 3、得到远程文件大小后,调用TADownFileObj.MakeGetObjs(),分配获取远程文件线程任务 本过程中,开始时,将向回调函数 AFtpDownEvent 触发 HEM_WORKBEGIN 事件通知 在接收数据时,向回调函数 AFtpDownEvent 触发 HEM_WORK 事件通知 4、工作线程调用任务对象 TFTPGetObj.DoThreadExecute 实际下载远程文件数据块 每一个数据块下载任务完成后,触发 HEM_BLOCKOK 事件通知 5、所有数据块完成后,将调用 DoDownloadOK 函数,触发 HEM_DOWNOK 事件通知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值