loo30fer
جمعه 01 آذر 1392, 20:20 عصر
با سلام خدمت تمامی دوستان
دوستان میشه بی زحمت توضیح بدین چرا مواقعی که ما در Thread نیاز به ارتباط با فرم داریم یا استفاده از Synchronize یا استفاده از SendMessage توصیه میشه در صورتی که با تعریف یک Event میشه اینکار رو انجام داد و مشکلی هم پیش نیاد مانند کدی که نوشتم :
با تشکر
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdComponent,
IdHTTP,
IdTCPConnection,
IdTCPClient,
IdBaseComponent;
type
TForm1 = class(TForm)
btn1: TButton;
Label1: TLabel;
btn2: TButton;
btn3: TButton;
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
procedure OnIdHTTPWork(ASender: TObject; AWorkCount: Int64);
{ Private declarations }
public
{ Public declarations }
end;
type
TOnWorkEvent = procedure(Sender: TObject; AWorkCount: int64) of object;
TDownloadThread = class (TThread)
private
FIdHTTP : TIdHTTP;
FURLHost : String;
FWork : TOnWorkEvent;
procedure Initialize;
//EVENT IDHTTP
procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
public
constructor Create(AURL: String);
procedure DownloadFile;
property OnWork : TOnWorkEvent read FWork write FWork;
protected
procedure Execute; override;
destructor Destory;
end;
var
Form1: TForm1;
th : TDownloadThread;
implementation
{$R *.dfm}
{------------------------------------ Thread ----------------------------------}
procedure TDownloadThread.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
OnWork(self,AWorkCount);
end;
constructor TDownloadThread.Create(AURL: String);
begin
inherited Create(True);
FreeOnTerminate := False;
FURLHost := AURL;
end;
procedure TDownloadThread.Initialize;
begin
FIdHTTP:= TIdHTTP.Create(nil);
with FIdHTTP do
begin
Request.Host := '';
Request.Username := '';
Request.Password := '';
OnWork := IdHTTPWork;
end;
end;
procedure TDownloadThread.DownloadFile;
begin
FIdHTTP.Get(FURLHost);
end;
procedure TDownloadThread.Execute;
begin
Initialize;
DownloadFile;
end;
destructor TDownloadThread.Destory;
var
i : integer;
begin
FreeAndNil(FIdHTTP);
inherited;
end;
{---------------------------------- End Thread --------------------------------}
procedure TForm1.btn1Click(Sender: TObject);
var
AUrl : String;
begin
AUrl := 'http://dl2.asandownload.com/mobile/android/application/Viber.v4.0.0.1707_www.AsanDownload.com.apk';
th := TDownloadThread.Create(AUrl);
th.OnWork := OnIdHTTPWork;
th.Start;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
th.Destory;
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
ShowMessage('hiiiiii');
end;
procedure TForm1.OnIdHTTPWork(ASender: TObject; AWorkCount: Int64);
begin
Label1.Caption := IntToStr(AWorkCount);
end;
end.
دوستان میشه بی زحمت توضیح بدین چرا مواقعی که ما در Thread نیاز به ارتباط با فرم داریم یا استفاده از Synchronize یا استفاده از SendMessage توصیه میشه در صورتی که با تعریف یک Event میشه اینکار رو انجام داد و مشکلی هم پیش نیاد مانند کدی که نوشتم :
با تشکر
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdComponent,
IdHTTP,
IdTCPConnection,
IdTCPClient,
IdBaseComponent;
type
TForm1 = class(TForm)
btn1: TButton;
Label1: TLabel;
btn2: TButton;
btn3: TButton;
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
procedure OnIdHTTPWork(ASender: TObject; AWorkCount: Int64);
{ Private declarations }
public
{ Public declarations }
end;
type
TOnWorkEvent = procedure(Sender: TObject; AWorkCount: int64) of object;
TDownloadThread = class (TThread)
private
FIdHTTP : TIdHTTP;
FURLHost : String;
FWork : TOnWorkEvent;
procedure Initialize;
//EVENT IDHTTP
procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
public
constructor Create(AURL: String);
procedure DownloadFile;
property OnWork : TOnWorkEvent read FWork write FWork;
protected
procedure Execute; override;
destructor Destory;
end;
var
Form1: TForm1;
th : TDownloadThread;
implementation
{$R *.dfm}
{------------------------------------ Thread ----------------------------------}
procedure TDownloadThread.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
OnWork(self,AWorkCount);
end;
constructor TDownloadThread.Create(AURL: String);
begin
inherited Create(True);
FreeOnTerminate := False;
FURLHost := AURL;
end;
procedure TDownloadThread.Initialize;
begin
FIdHTTP:= TIdHTTP.Create(nil);
with FIdHTTP do
begin
Request.Host := '';
Request.Username := '';
Request.Password := '';
OnWork := IdHTTPWork;
end;
end;
procedure TDownloadThread.DownloadFile;
begin
FIdHTTP.Get(FURLHost);
end;
procedure TDownloadThread.Execute;
begin
Initialize;
DownloadFile;
end;
destructor TDownloadThread.Destory;
var
i : integer;
begin
FreeAndNil(FIdHTTP);
inherited;
end;
{---------------------------------- End Thread --------------------------------}
procedure TForm1.btn1Click(Sender: TObject);
var
AUrl : String;
begin
AUrl := 'http://dl2.asandownload.com/mobile/android/application/Viber.v4.0.0.1707_www.AsanDownload.com.apk';
th := TDownloadThread.Create(AUrl);
th.OnWork := OnIdHTTPWork;
th.Start;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
th.Destory;
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
ShowMessage('hiiiiii');
end;
procedure TForm1.OnIdHTTPWork(ASender: TObject; AWorkCount: Int64);
begin
Label1.Caption := IntToStr(AWorkCount);
end;
end.