delphi Idhttp 下载文件 Thread  
官方Delphi 学习QQ群: 682628230(三千人)\n
频道

delphi Idhttp 下载文件 Thread


unit UUpdater;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,

  xpman, Gauges, ComCtrls, UDownThread, zlib, Grids, BaseGrid, AdvGrid;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    Status: TLabel;

    SpeedLabel: TLabel;

    msg: TMemo;

    Progress: TProgressBar;

    Edit1: TEdit;

    Button2: TButton;

    Button3: TButton;

    StringGrid1: TAdvStringGrid;

    Button4: TButton;

    Edit2: TEdit;

    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private

    { Private declarations }

    StartTime: Cardinal;

    procedure download(wwwurl: string);

    procedure OnThreadWork(Sender: TThread; AWorkCount: Integer);

    procedure OnThreadWorkBegin(Sender: TThread; AWorkCountMax: Integer);

   // procedure DownResultHandle(Sender: TObject; ResponseCode: Integer);

 

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

   abbruch :Boolean;

    ndx:integer;

implementation

 

{$R *.dfm}

 

procedure TForm1.OnThreadWork(Sender: TThread; AWorkCount: Integer);

var

  speed: single;

begin

  Progress.Position := AWorkCount;

  speed := AWorkCount/(GetTickCount - StartTime + 1); //+1 um DivbyZero zu verhindern

  Status.caption := Format('%f s|%.2f KB/s', [(((Sender as TDownThread).WorkCountMax-AWorkCount)/1000)/speed, speed]);

end;

 

procedure TForm1.OnThreadWorkBegin(Sender: TThread; AWorkCountMax: Integer);

begin

  Progress.Max := AWorkCountMax;

  msg.Lines.Append(FormatFloat('Dateigröße: 0, Bytes', AWorkCountMax));

  StartTime := GetTickCount;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  msg.Lines.Append('--------------------------');

  msg.Lines.Append('Starte Download ...');

  download('http://localhost/tools/checkhttp.php?name='+ edit1.text);

  msg.Lines.Append('Download abgeschlossen');

  SpeedLabel.Caption := 'Fertig';

  Button2.Click;

end;

 

 

 

 

procedure TForm1.download(wwwurl: string);

var

  path: string;

  Down: TDownThread;

begin

  path := ExtractFilePath(paramstr(0)) + 'Update\tmp.txt';

  Status.Caption := '';

  Progress.Position := 0;

 

  msg.Lines.Append('Downloade Datei ' + path);

 

  Down := TDownThread.Create(true);

  with Down do

  begin

    FreeOnTerminate := true;

    OnWork := OnThreadWork;

    OnWorkBegin := OnThreadWorkBegin;

  // OnFinish := DownResultHandle;

    URL := wwwurl;

    FileName := path;

    Resume;

    end;

end;

 

 

 

procedure TForm1.FormCreate(Sender: TObject);

begin

ndx:=1;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

 

var

 

s:string;

begin

 

abbruch := false;

 

      while (ndx < StringGrid1.RowCount - 1) and (not abbruch) do // war sonst 0

    begin

    edit1.text:= StringGrid1.Cells[4, ndx]; //name

   abbruch := true;

   inc(ndx);

  end;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

  abbruch := True;

end;

 

procedure TForm1.Button4Click(Sender: TObject);

begin

StringGrid1.LoadFromCSV(ExtractFilePath(Application.ExeName) + 'komma.csv');

end;

 

end.

 

$show_page$

unit UDownThread;

 

interface

 

uses

  Windows, SysUtils, Classes, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdBaseComponent;

 

type

  //external prototypes

  TOnWorkBeginEvent = procedure(Sender: TThread; AWorkCountMax: Integer) of object;

  TOnWorkEvent = procedure(Sender: TThread; AWorkCount: Integer) of object;

  TOnFinish = procedure(Sender: TObject; ResponseCode: Integer) of object;

 

  TDownThread = class(TThread)

  private

    { Private declarations }

    HTTP: TIdHTTP;

    //external

    FOnWorkBeginEvent: TOnWorkBeginEvent;

    FOnWorkEvent: TOnWorkEvent;

    FOnFinish: TOnFinish;

 

    FResponseCode: Integer;

    FURL: string;

    FFileName: String;

    FWorkCountMax: Integer;

    FWorkCount: Integer;

    procedure InternalOnWork(Sender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);

    procedure InternalOnWorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);

    procedure DoNotifyFinish;

    procedure DoNotifyWorkBegin;

    procedure DoNotifyWork;

  protected

    procedure Execute; override;

  public

    { Public declarations }

    constructor Create(CreateSuspended: Boolean);

    destructor Destroy; override;

    property URL: String read FURL write FURL;

    property FileName: String read FFileName write FFileName;

    property WorkCountMax: Integer read FWorkCountMax;

    property OnWork: TOnWorkEvent read FOnWorkEvent write FOnWorkEvent;

    property OnWorkBegin: TOnWorkBeginEvent read FOnWorkBeginEvent write FOnWorkBeginEvent;

    property OnFinish: TOnFinish read FOnFinish write FOnFinish;

  end;

 

implementation

 

 

 

constructor TDownThread.Create;

begin

  inherited Create(True);

  HTTP := TIdHTTP.Create(nil); // HTTP-Kompo wird dynamisch erstellt

  with HTTP do

  begin

    OnWorkBegin := InternalOnWorkBegin;

    OnWork := InternalOnWork;

// HTTP.IOHandler.RecvBufferSize:=4096; //löst AccessViolation aus !?!

  end;

end;

 

destructor TDownThread.Destroy;

begin

  HTTP.Free;

  inherited Destroy;

end;

 

procedure TDownThread.Execute;

var

  lStream: TFileStream;

begin

  lStream:=TFileStream.Create(FileName, fmCreate or fmShareDenyNone);

  try

    HTTP.Get(FURL, lStream);

    FResponseCode := HTTP.ResponseCode;

  finally

    if Assigned(lStream) then lStream.Free;

  end;

  Synchronize(DoNotifyFinish);

end;

 

procedure TDownThread.DoNotifyFinish;

begin

  if Assigned(OnFinish) then OnFinish(Self, FResponseCode);

end;

//##############################################################################

procedure TDownThread.InternalOnWorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);

begin

  FWorkCountMax := AWorkCountMax;

  Synchronize(DoNotifyWorkBegin);

end;

 

procedure TDownThread.DoNotifyWorkBegin;

begin

  if Assigned(OnWorkBegin) then OnWorkBegin(Self, FWorkCountMax);

end;

//##############################################################################

procedure TDownThread.InternalOnWork(Sender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);

begin

  FWorkCount := AWorkCount;

  Synchronize(DoNotifyWork);

end;

 

procedure TDownThread.DoNotifyWork;

begin

  if Assigned(OnWork) then OnWork(Self, FWorkCount);

end;

 

end.


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.67702603340149 seconds